Давно хотел сделать вывод видео из google chrome в отдельном окне (без рамки, простым оверлеем без всяких MPV на основе превьюшек (thumbnails)).
Решил совместить приятное с полезным и за одно посмотнреть на QML. Такчто можно сказать получился «Hello World» на QML. Решил выложить (может кому пригодится - можно применять не только к браузерам а к любому софту хоть к консоли).
Как пользоватся:
Открываем страницу с нужным видео (youtube, twitch и тд) в отдельном окне браузера и затаскиваем его на виртуальный десктоп «для хлама». Запускаем «thumb.sh» появляется курсор выбора окна (xwininfo). Кликаем по окну браузера и ждем запуска основного приложения. Появляется синий полупрозрачный прямоугольник который нужно расположить точно поверх видео (помогает зажатый Alt + левая / правая кнопка мыши). После того как оверлей выравнен по видео нажимаем кнопку 'lock' (или дабл клик мыши по оверлею). Далее распологаем наш фрагмент окна в желаемой позиции монитора (дабл клик переключает между большим и малым размером).
thumb.sh
#!/bin/bash
cd `dirname "$0"`
lines=`xwininfo|tr -d ' ' | tr '":' ' '`
dstVar=""
for line in $lines; do
if [ ! -z "${dstVar}" ]; then
eval "${dstVar}=${line}"
dstVar=""
fi
case "${line}" in
'Windowid') dstVar='id' ;;
'Width' ) dstVar='width' ;;
'Height' ) dstVar='height' ;;
'Absoluteupper-leftX' ) dstVar='left' ;;
'Absoluteupper-leftY' ) dstVar='top' ;;
* ) ;;
esac
done
exec qml thumb.qml -- ${id} ${left} ${top} ${width} ${height}
thumb.qml
import QtQuick 2.2
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import org.kde.plasma.core 2.0 as PlasmaCore
Window
{
id: wnd
visible: true
width: 320
height: 160
title: 'Thumb'
color: 'blue'
opacity: 0.5
flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint
property var isLocked: false
property var maxWidth: 0;
property var minWidth: 0;
property var isMax: false;
property var src:
({
x: parseInt(Qt.application.arguments[4]),
y: parseInt(Qt.application.arguments[5]),
w: parseInt(Qt.application.arguments[6]),
h: parseInt(Qt.application.arguments[7])
})
property var crop:
({
x: 0,
y: 0,
w: parseInt(Qt.application.arguments[6]),
h: parseInt(Qt.application.arguments[7])
})
function lock()
{
wnd.opacity = 1.0;
wnd.isLocked = true;
lockBtn.visible = false;
thumb.visible = true;
wnd.maxWidth = crop.w;
wnd.minWidth = crop.w;
console.log('Locked !');
}
function togleMinMax()
{
var nw, nh;
if( wnd.isMax )
{
nw = wnd.minWidth;
wnd.maxWidth = wnd.width;
wnd.isMax = false;
}
else
{
nw = wnd.maxWidth;
wnd.minWidth = wnd.width;
wnd.isMax = true;
}
nh = ((nw * crop.h) / crop.w);
wnd.x -= (nw - wnd.width);
wnd.y -= (nh - wnd.height);
wnd.width = nw;
wnd.height = nh;
}
function fixThumb()
{
if( wnd.isLocked )
{
var sf = wnd.width / crop.w;
console.log('Scale factor: ' + sf);
thumb.x = -(crop.x * sf);
thumb.y = -(crop.y * sf);
thumb.width = src.w * sf;
thumb.height = src.h * sf;
}
else
{
crop.x = (wnd.x - src.x);
crop.y = (wnd.y - src.y);
crop.w = wnd.width;
crop.h = wnd.height;
thumb.x = - crop.x;
thumb.y = - crop.y;
}
}
onXChanged: { if(! wnd.isLocked) fixThumb(); }
onYChanged: { if(! wnd.isLocked) fixThumb(); }
onHeightChanged: { fixThumb(); }
onWidthChanged: { fixThumb(); }
PlasmaCore.WindowThumbnail {
id: thumb
visible: false;
x: 0
y: 0
width: parseInt(Qt.application.arguments[6])
height: parseInt(Qt.application.arguments[7])
winId: parseInt(Qt.application.arguments[3])
}
MouseArea
{
anchors.fill: parent
onDoubleClicked:
{
if( wnd.isLocked )
{
wnd.togleMinMax();
}
else
{
wnd.lock();
}
}
}
Button
{
id: lockBtn
anchors.top: parent.top
anchors.right: parent.right
text: 'lock'
onClicked: { wnd.lock(); }
}
}
PS. На моем KDE 5.6.5 работает, будет ли еще гдето работать - хз