Hacker News Digest

04 августа 2025 г. в 12:03 • blog.broulik.de • ⭐ 213 • 💬 124

OriginalHN

#wayland#xdg-activation#qt#kde#dbus#x11

Window Activation

Как приложение получает фокус в Wayland
В X11 окно могло «захватить» внимание само; в Wayland это невозможно. Приложение может лишь получить фокус, если композитор одобрит запрос. Для этого используется протокол XDG Activation.

  1. Приложение-источник (например, мессенджер) запрашивает у композитора токен активации.
  2. Токен передаётся целевому приложению через переменную окружения XDG_ACTIVATION_TOKEN или поле activation-token в DBus.
  3. Получив токен, приложение просит композитор активировать своё окно.
  4. Композитор проверяет подлинность: наличие токена, серийный номер события, ID приложения и т.д. При сомнении запрос отклоняется.

Готовые решения в KDE/Qt

  • QWindow::requestActivate() сама использует токен из окружения или запрашивает новый.
  • OpenUrlJob, ApplicationLauncherJob, KDBusService уже умеют работать с токенами.
    Благодаря этому большинство KDE-приложений работают без изменений.

Почему X11 не идеален
У KWin-X11 была «защита от кражи фокуса», но она опиралась на эвристики и могла быть обойдена.

Тестируем правильность
В свежем KWin включите «Extreme»-режим предотвращения кражи фокуса: окно поднимется только при валидном токене. За последние дни исправлены:

  • Dolphin терял токен при новом запуске;
  • KRunner, Kickoff и прочие плазмоиды не запрашивали токен;
  • LayerShell-Qt теперь читает переменную и запрашивает активацию при показе;
  • привилегированные клиенты (Plasma, KGlobalAccel) могут получать токены;
  • нажатия модификаторов больше не считаются «пользовательским взаимодействием».

Спецификация DBusRunner получила метод SetActivationToken, который теперь используют Baloo и KClock для корректного открытия файлов в уже запущенных окнах.