Created attachment 12965 [details] Два монитора Тестовый стенд p10 kworkstation x86-64 (реальная машина, см inxi) rpm -qa | grep flameshot flameshot-12.1.0-alt1 Шаги воспроизведения: 1. Запустить программу: $ flameshot. 2. Подключить второй монитор -> Нажать на значок программы в трее. Ожидаемый результат: Корректное отображение рабочего стола при создании снимка. Фактический результат: Происходит смещение рабочего стола. Приложен скриншот, см. вложения. Дополнительное исследование: Если второго монитора нет, программа работает корректно.
Created attachment 12966 [details] inxi-F.txt
Такая же ситуация, как только пытаешься сделать скринот, разваливается изображение. [root@msi-pulse play.d]# inxi -Gxx Graphics: Device-1: Intel Alder Lake-P GT2 [Iris Xe Graphics] vendor: Micro-Star MSI driver: i915 v: kernel arch: Gen-12.2 ports: active: eDP-1 empty: none bus-ID: 00:02.0 chip-ID: 8086:46a6 Device-2: NVIDIA GA106M [GeForce RTX 3060 Mobile / Max-Q] vendor: Micro-Star MSI driver: nvidia v: 550.90.07 arch: Ampere pcie: speed: 2.5 GT/s lanes: 8 ports: active: none off: HDMI-A-1 empty: none bus-ID: 01:00.0 chip-ID: 10de:2520 Device-3: Bison HD Webcam driver: uvcvideo type: USB rev: 2.0 speed: 480 Mb/s lanes: 1 bus-ID: 1-6:2 chip-ID: 5986:211b Device-4: Logitech Webcam C930e driver: snd-usb-audio,uvcvideo type: USB rev: 2.0 speed: 480 Mb/s lanes: 1 bus-ID: 1-8.3.3:11 chip-ID: 046d:0843 Display: server: X.Org v: 1.21.1.13 with: Xwayland v: 24.1.2 compositor: kwin_x11 driver: X: loaded: modesetting,nvidia unloaded: fbdev,nouveau,vesa alternate: nv dri: iris gpu: i915,nvidia,nvidia-nvswitch display-ID: :0 screens: 1 Screen-1: 0 s-res: 5760x2934 s-dpi: 128 Monitor-1: HDMI-A-1 mapped: HDMI-1-0 note: disabled pos: primary,bottom-l model: M2766UPB res: 3840x2160 dpi: 163 diag: 685mm (27") Monitor-2: eDP-1 pos: top-right model: AU Optronics 0x978f res: 1920x1080 dpi: 128 diag: 438mm (17.3") API: EGL v: 1.5 platforms: device: 0 drv: nvidia device: 1 drv: iris device: 3 drv: swrast gbm: drv: iris surfaceless: drv: nvidia x11: drv: iris inactive: wayland,device-2 API: OpenGL v: 4.6.0 compat-v: 4.5 vendor: intel mesa v: 24.1.5 glx-v: 1.4 direct-render: yes renderer: Mesa Intel Graphics (ADL GT2) device-ID: 8086:46a6 API: Vulkan v: 1.3.283 surfaces: xcb,xlib device: 0 type: integrated-gpu driver: N/A device-ID: 8086:46a6 device: 1 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 2 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 3 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 4 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 5 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 6 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 7 type: discrete-gpu driver: N/A device-ID: 10de:2520 device: 8 type: cpu driver: N/A device-ID: 10005:0000
Результат проверки актуальности Состояние: p10 flameshot-12.1.0-alt1. В Sisyphus flameshot-14.0-alt0.rc1, куда вошли исправления смещения на X11. Аппаратного ретеста на смешанном Intel/NVIDIA нет. Рекомендация: выполнить ретест снимка с двумя мониторами на актуальном Sisyphus.
flameshot-14.0-alt0.rc1 (задание https://packages.altlinux.org/tasks/414590/), Sisyphus 2026-09-17, MATE 1.28/X11 (marco), Qt 6.11.2, xorg-server 21.1.24, два RandR-монитора 640x800+0+0 и 640x800+640+0 (xrandr --setmonitor на одном virtio-выходе 1280x800), Xft.dpi=100 (MATE по умолчанию): воспроизводится. `flameshot gui` (штатный портальный режим) → «Monitor 2: right»: оверлей покрывает ровно правый монитор, но окно Caja под ним сдвинуто влево (обрезан левый край окна, «айл Правка Вид…», заголовок «icons» на x=916 вместо 923) и растянуто; сохранённая область 350x300 не совпадает с экраном (лучшее совпадение со сдвигом 4 px и остаточной разницей ΔRGB 11.7 — картинка перемасштабирована). При Xft.dpi=128 (как «s-dpi: 128» в комментарии 2) сдвиг ~90 px, боковая панель окна отрезана, справа показаны обои, которых там нет — картина с фото из описания. Неинтерактивно, экран 0 (средняя |ΔRGB| к root-экрану по четырём полосам x): Xft.dpi=100 : 11.9 | 15.9 | 4.9 | 40.6 (правые 13 px монитора потеряны, растяжение 627→640) Xft.dpi=100 + QT_SCREEN_SCALE_FACTORS=1 : без изменений Xft.dpi=100 + QT_SCALE_FACTOR_ROUNDING_POLICY=Round: 0.00 | 0.00 | 0.00 | 0.00 Xft.dpi=96 : 0.00 | 0.00 | 0.00 | 0.00 т.е. виноват дробный high-DPI множитель Qt 6 (Xft.dpi/96), который KDE на X11 выставляет при масштабе больше 100 %. В legacy-режиме (useX11LegacyScreenshot=true) оверлей и выделение точные (ΔRGB 0.0), но `flameshot full` даёт 1306x800 вместо 1280x800 с чёрной полосой 26 px между мониторами (при dpi 128 — 1493x800, полоса 213 px; вертикальная раскладка — 1280x817). Причина (по исходникам 14.0.rc1, ветка sisyphus): в Qt 6 на xcb QScreen::geometry() при множителе f ≠ 1 отдаёт размер, делённый на f, а позицию — нативную (https://doc.qt.io/qt-6/highdpi.html#device-independent-screen-geometry): при f=1,0417 экраны = 614x768+0+0 и 614x768+640+0. ScreenGrabber::cropToMonitor() (src/utils/screengrabber.cpp:476–485) считает minX/maxX/totalLogicalWidth прямо из geometry(): total = 1254 вместо 1229, scale = 1280/1254 = 1,0207, cropX правого = 640·1,0207 = 653 (надо 640), cropWidth = 614·1,0207 = 627 (надо 640), затем строки 579–585 растягивают 627→640. Та же ошибка в x11LegacyScreenshot() (695–711: totalGeom и offset из geometry() без деления позиции на dpr) — даёт чёрный зазор в `full`, а в gui компенсируется той же неверной геометрией в cropToMonitor, поэтому legacy-оверлей точный. Правильная нормализация уже есть рядом — desktopGeometry() (341–355: `scrRect.moveTo(x/dpr, y/dpr)`), но cropToMonitor/x11Legacy её не используют. Апстримный master (2026-09) содержит тот же код, финальный 14.0.0 (2026-06-19) это не чинит. Примерная правка (не собиралась): в cropToMonitor заменить цикл 476–482 на for (QScreen* screen : screens) { QRect geo = screen->geometry(); qreal d = screen->devicePixelRatio(); geo.moveTo(qRound(geo.x() / d), qRound(geo.y() / d)); // как в desktopGeometry() minX = qMin(minX, geo.x()); minY = qMin(minY, geo.y()); maxX = qMax(maxX, geo.x() + geo.width()); maxY = qMax(maxY, geo.y() + geo.height()); } и в строках 514–515 брать qRound(targetGeometry.x()/targetDpr) − minX (аналогично y); в x11LegacyScreenshot собирать композит в нативных пикселях (p.setDevicePixelRatio(1), offset = s->geometry().topLeft() − минимум нативных позиций). Попутно в rc1: `flameshot screen -n 1` всегда снимает экран 0 (src/main.cpp:561–583 кладёт номер в запрос только при --edit, Flameshot::screen берёт request.data().toInt() = 0, src/core/flameshot.cpp:361) — в 14.0.0 rc3 исправлено («Improved screen selection in non-interactive mode», апстрим #4925). В MATE/X11 flameshot 14 без флажка «Use legacy X11 screenshot method» не снимает вовсе: xdg-desktop-portal не стартует (Requisite=graphical-session.target, mate-session его не активирует), а gtk-бэкенд Screenshot требует gnome-shell. Апстримные тикеты: #4111 (закрыт PR #4127 → 13.1.0), #4382, PR #4498 «Multimonitor fix» (14.0), #4894 «Rework Multi-Monitor support» (открыт); отдельного про дробный Xft.dpi на X11 в v14 не нашёл. Перевешиваю на сопровождающего: обновить до 14.0.0 и приложить/отправить в апстрим нормализацию позиций экранов по DPR.