Действительно ли возможно зеркально отразить живой раздел одной рабочей области так, чтобы это было видимо в текущей рабочей области как окно, которое может быть перемещено?
На днях у меня был Windows 10 VM, работающий на моем хосте Ubuntu 16.04, который действительно занял много времени для завершения обновления. Я продолжал проверять его прогресс через Экспо (Super+S) на Ubuntu. Это получило меня думающий, что эта проблема уже была, скорее всего, решена, так как инструменты, такие как simplescreenrecorder могут быть настроены для записи просто части экрана. Однако я не знаю, что надлежащая терминология использует для моего поиска Google.
Я хотел бы видеть 300x150 снимок экрана ниже в форме плавающего окна (с живыми обновлениями) в правом верхнем углу того, какой бы ни рабочая область, оказывается, является текущей.
(Новый ответ)
ГОТОВО.
Приведенный ниже ответ теперь доступен в отшлифованной форме, как индикатор, как ppa для Trusty, Xenial, Yakkety и Zesty:
sudo apt-add-repository ppa:vlijm/windowspy
sudo apt-get update
sudo apt-get install windowspy
Индикатор (включая окно предварительного просмотра) теперь имеет низкий уровень сока. Опции включают окно настроек, размер / цвет границы окна, размер окна.
Тем временем, я счел полезным следить за окном AU; посмотрим, есть ли какие-нибудь сообщения :)
СТАРЫЙ ОТВЕТ
( первая вторая приблизительная концепция)
На мой собственный (большой) сюрприз, это можно эффективно сделать, будь то с обман и обман; иметь обновленное представление окна в другом рабочем пространстве. Не подходит для просмотра фильма, определенно достаточно хорошо, чтобы смотреть в окно в другом месте (пример: окно моей ТВ-карты):
С окном впереди , нажмите сочетание клавиш:
(окно будет свернуто)
Перейдите в другое рабочее пространство, снова нажмите сочетание клавиш, появится небольшое представление окна, обновляющееся каждые 4 секунды:
Окно всегда отображается поверх других окон. Как бы то ни было, размер окна составляет 300 пикселей (ширина), но может быть установлен любой размер.
Чтобы закрыть окно, нажмите (еще раз) горячую клавишу. Маленькое окно закроется, вы переместитесь в область просмотра исходного окна, которое снова появится без минимального размера.
Управляющий скрипт
#! / Usr / bin / env python3
подпроцесс импорта
импорт ОС
import sys
время импорта
# пути
imagepath = os.path.join (os.environ ["ГЛАВНАЯ"], ".showcase")
wfile = os.path.join (путь к изображению, "текущее окно")
vpfile = os.path.join (путь к изображению, "last_vp")
# путь установки
если не os.path.exists (путь к изображению):
os.mkdir (путь к изображению)
def get (команда):
пытаться:
return subprocess.check_output (команда) .decode ("utf-8"). strip ()
кроме subprocess.CalledProcessError:
проходить
def get_vp ():
open (vpfile, "wt"). write (get (["wmctrl", "-d"]). split () [5])
def run (команда):
subprocess.Popen (команда)
def convert_tohex (widxd):
return widxd [: 2] + ((10-len (widxd)) * "0") + widxd [2:]
def check_windowtype (wid):
check = get (["xprop", "-id", wid])
не вернуть ни одного ([s в проверке s в [
"_NET_WM_WINDOW_TYPE_DOCK",
"_NET_WM_WINDOW_TYPE_DESKTOP"]])
def edit_winprops (wid, convert = True):
run (["xdotool", "windowminimize", wid])
если преобразовать:
widxd = convert_tohex (шестнадцатеричный (int (wid)))
еще:
widxd = wid
run ([«wmctrl», «-i», «-r», widxd, «-b», «добавить, липкий»])
get_vp ()
open (os.path.join (путь к изображению, "текущее окно"), "wt"). write (widxd)
def initiate_min ():
# если нет, уменьшить окно, записать файл
wid = get (["xdotool", "getactivewindow"])
если check_windowtype (wid):
edit_winprops (wid)
еще:
pidinfo = [l.split () для l в wlist.splitlines ()]
match = [l вместо l в pidinfo, если все ([
get (["ps", "-p", l [2], "-o", "comm ="]) == "VirtualBox",
не "Менеджер" в l])]
если совпадение:
edit_winprops (совпадение [0] [0], convert = False)
# список окон
wlist = get (["wmctrl", "-lp"])
если "Предварительный просмотр окна" в списке:
# убиваем миниокно
pid = get (["pgrep", "-f", "showmin"])
run (["убить", pid])
окно = открыть (wfile) .read (). strip ()
viewport = open (vpfile) .read (). strip ()
run (["wmctrl", "-o", область просмотра])
time.sleep (0,3)
run (["wmctrl", "-i", "-r", window, "-b", "remove, sticky"])
запустить (["wmctrl", "-ia", окно])
os.remove (wfile)
еще:
# проверяем, существует ли оконный файл
wfileexists = os.path.exists (wfile)
если wfileexists:
# если файл существует, попробуйте запустить miniwindow
окно = открыть (wfile) .read (). strip ()
если окно в списке:
# если окно существует, запускаем!
run (["showmin", окно])
еще:
# если нет, уменьшить окно, записать файл
initiate_min ()
еще:
# если нет, уменьшить окно, записать файл
initiate_min ()
Представление окна
#! / Usr / bin / env python3
импорт gi
gi.require_version ('Gtk', '3.0')
из gi.repository import Gtk,GObject
из PIL импорта изображения
импорт ОС
подпроцесс импорта
время импорта
from threading import Thread
import sys
wid = sys.argv [1]
xsize = 300
imagepath = os.path.join (os.environ ["ГЛАВНАЯ"], ".showcase")
если не os.path.exists (путь к изображению):
os.mkdir (путь к изображению)
img_in = os.path.join (путь к изображению, "изображение.png")
resized = os.path.join (путь к изображению, "resized.png")
def get_img ():
subprocess.Popen ([
"import", "-window", wid, "-resize", str (xsize), размер изменен
])
get_img ()
класс Splash (Gtk.Window):
def __init __ (сам):
Gtk.Window .__ init __ (self, title = "Предварительный просмотр окна")
maingrid = Gtk.Grid ()
self.add (maingrid)
self.image = Gtk.Image ()
# задаем путь к изображению ниже
self.resized = размер изменен
self.image.set_from_file (с измененным размером)
maingrid.attach (self.image, 0, 0, 1, 1)
maingrid.set_border_width (3)
self.update = Тема (цель = self.update_preview)
self.update.setDaemon (Истина)
self.update.start ()
def update_preview (самостоятельно):
в то время как True:
get_img ()
время сна (3)
GObject.idle_add (
self.image.set_from_file, self.resized,
priority = GObject.PRIORITY_DEFAULT
)
def miniwindow ():
window = Всплеск ()
window.set_decorated (Ложь)
window.set_resizable (Ложь)
window.set_keep_above (Истина)
window.set_wmclass ("Витрина", "витрина")
window.connect ("уничтожить", Gtk.main_quit)
GObject.threads_init ()
window.show_all ()
window.move (70, 50)
Gtk.main ()
miniwindow ()
Установить python3-pil
, xdotool
и wmctrl
sudo apt-get install xdotool wmctrl python3-pil
Создайте, если он еще не существует, каталог ~ / bin
.
showcase_control
(без расширения ) в ~ / bin
и сделать его исполняемым . showmin
(без расширения ) в ~ / bin
, и сделать его исполняемым . Выйдите из системы и снова войдите, а затем добавьте следующую команду к выбранному вами ярлыку:
showcase_control
Выберите: Системные настройки> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите "+" и добавьте команду:
showcase_control
и он должен работать!
Текущая настройка добавляет некоторую работу для вашего процессора. Однако в моей (очень) старой системе он добавляет (в среднем) ок. 4-5% Я полагаю, что я не заметил каким-либо способом.
Обновление: Оказывается, import
может изменить размер изображения за один шаг вместе с получение изображения окна. Это означает существенное снижение нагрузки на процессор. В то же время время обновления короче (теперь 3 секунды), но по-прежнему с меньшими «затратами».
import
, если у нас есть идентификатор окна. Хотя и то, и другое работает для свернутых окон или окон без фокуса, однако есть одна проблема: окно должно быть в текущей рабочей области . wmctrl
, но в то же время свернуть его. Когда Окно VBox находится впереди, оказывается, что горячие клавиши Ubuntu отключены (!), Поэтому скрипт управления нужно запускать другим способом. Ниже несколько кратких.
Я редактировал управляющий скрипт. Теперь только в случае VirtualBox:
Щелкните в любом месте на рабочем столе, Затем нажмите комбинацию клавиш. После этого,просто воспользуйтесь сочетанием клавиш, чтобы открыть окно и выйти.
Объяснение: Сценарий управления был настроен на выход, если окно было типа "рабочий стол", поскольку вы не хотели бы сворачивать рабочий стол. Теперь сценарий сначала ищет, возможно, существующие окна VirtualBox, если текущим активным окном является рабочий стол.
Скопируйте значок ниже (щелкните правой кнопкой мыши -> сохранить как), сохраните его как minwinicon.png
Скопируйте приведенные ниже строки в пустой файл, сохраните его как minwin.desktop
в ~ / .local / share / applications
:
[Desktop Entry]
Тип = Приложение
Name = Window Spy
Exec = showcase_control
Значок = / путь / к / minwinicon.png
StartupNotify = false
Вам нужно будет выйти и снова войти в программу запуска, чтобы «найти» локальный путь ~ / bin
!
Перетащите значок на панель запуска, чтобы использовать его.
У второго решения есть важный недостаток: после использования из панели запуска он будет продолжать мигать в течение нескольких секунд, ожидая появления окна. Во время этого повторное нажатие не будет иметь никакого эффекта. Это может быть решено, как описано здесь , но включение этого в этот ответ действительно сделало бы его слишком длинным. Если вы хотите использовать второй вариант, перейдите по ссылке.
Что-то, что кажется излишним, но полностью подходит для этой цели, - это Open Broadcaster . В списке «Источники» щелкните значок «плюс», выберите «Захват окон», затем следуйте инструкциям по выбору интересующего вас окна. Нет смысла выбирать запись; просто воспользуйтесь предварительным просмотром. Он доступен для практически любой ОС , с инструкциями для Ubuntu здесь , которые я скопировал ниже.
sudo apt-get install ffmpeg
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt-get update
sudo apt-get install obs-studio
Если вам это нравится, вы можете перейти в «Просмотр» "меню и скрыть все элементы пользовательского интерфейса.