Люди — странные нелогичные существа. Вот одни дебилы на телевидении налепили логотип на картинку, и осталась в доступе только такая версия фильма. Затем другие дебилы решили это "исправить", и замазали логотип "прозрачным слоем", из-за чего он стал отвлекать и раздражать ещё больше. На скриншоте угол экрана с замазанным логотипом. Это крайне удачный кадр, другие куда хуже, их даже в статике не покажешь, настолько это мешанина из заблюреных пикселей.
Оригинальный логотип хоть не мерцает и не отвлекает непрерывно глаз, а это убожество берёт цвета для заливки с боков, и если фон не статичный, то постоянно их меняет. Выглядит это настолько убого, что я уже начал просто заклеивать экран в месте этого непотребства изолентой, чтобы не отвлекаться.
Но это не наш метод! А как же linux-way, спросил я себя и бросил клич. Нашлось целых два варианта.
Задача - прикрыть мерцающий блок сверху ещё одним полупрозрачным, снизив таким образом интенсивность мерцания.
Первый - запуск mpv с отрисовкой поверх картинки полупрозрачного блока по заданным координатам:
mpv '--vf=lavfi="drawbox=x=10:y=10:w=100:h=100:color=black@0.6:t=fill"' ИМЯ_ВИДЕОФАЙЛА
Есть минус - нужно заранее вычислять координаты, запускать mpv отдельно от smplayer, либо изменять конфигурацию каждый раз, когда нужен блок.
Второй метод - отдельный скрипт.
Как создать маленькое полупрозрачное окно?
С Qt 5.15, технологией QtQuick и языком программирования QML очень просто. (q) EXL
Запускается из консоли, отрисовывает по дефолтным координатам прямоугольный полупрозрачный блок, который можно перетаскивать и изменять размер мышью, колёсиком менять степень прозрачности. Я решил, что это самый универсальный метод.
Создать файл overlay.qml со следующим содержимым:
import QtQuick 2.12 import QtQuick.Window 2.12
Window { color: Qt.rgba(0.0, 0.0, 0.0, 0.5)
id: window visible: true flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.WA_TranslucentBackground
Shortcut { sequence: "Esc" onActivated: window.close() }
DragHandler { id: resizeHandler onActiveChanged: if (active) { const p = resizeHandler.centroid.position let e if (p.x / width < 0.10) { e |= Qt.LeftEdge } if (p.x / width > 0.90) { e |= Qt.RightEdge } if (p.y / height < 0.10) { e |= Qt.TopEdge } if (p.y / height > 0.90) { e |= Qt.BottomEdge } if (e) { window.startSystemResize(e) } else { window.startSystemMove() } } }
MouseArea { anchors.fill: parent property real op: 0.5 onWheel: { if (wheel.angleDelta.y > 0 && op < 1.0) op += 0.01 else if (wheel.angleDelta.y < 0 && op > 0.0) op -= 0.01 window.color = Qt.rgba(0.0, 0.0, 0.0, op) } } }
Запуск программы: QT_QPA_PLATFORM=xcb qmlscene Overlay.qml
Достигнуты все поставленные условия:
- Простой строкой в консоли создать окно без всяких декораций.
- Полупрозрачное по заданному проценту.
- Поверх всех окон.
- Оно должно перетаскиваться мышой.
- Должен изменяться размер.
- Выглядит просто как полупрозрачный прямоугольник.
Цвет и полупрозрачность прямоугольника настраивается в функции Qt.rgba(0.0, 0.0, 0.0, 0.5), изначально установлена в 50%, первые три компоненты отвечают за цвет в RGB-формате. Таскать окно по экрану можно зажав кнопку мыши в центре окна и перемещая курсор, размер изменяется аналогичным образом но по краям прямоугольника. На клавишу Esc задан выход.
|