Поддерживается ли прозрачность окна для моно форм?

Я разрабатываю мультиплатформенную программу с использованием Mono, и она требует поддержки Form Opacity. В основном возможность сделать окно полупрозрачным. Это прекрасно работает в Windows, установив свойство Window.Form.Opacity, скажем, 0,5. В Ubuntu 14.04, однако, он не работает "из коробки". Я думаю, что я использую Unity и Compiz, что бы ни поставлялось с настройкой Ubuntu по умолчанию.

Согласно Mono FAQ, это должно поддерживаться:

Как я могу сделать мои окна альфа смешанными? (Прозрачный)

Реализация Mono в Winform поддерживает прозрачность в своих окнах до тех пор, пока соответствующая система управления окнами поддерживает ее.

Для пользователей Unix/X11 это означает, что у них должно быть включено расширение COMPOSITE на их сервере, и у них должен быть запущен менеджер композитинга, такой как xcompmgr.

В GenToo Linux Wiki есть хорошее описание того, как настроить сервер Xorg для поддержки прозрачности.

http://www.mono-project.com/docs/faq/winforms/

Ссылка, на которую они указывают, мертва.

Я новичок в Linux и не совсем уверен, что понимаю все части, необходимые для запуска и запуска оконного менеджера компоновки. Кроме того, у меня уже нет одного (compiz?)

Что я должен попытаться заставить мою прозрачность Winform работать?

Изменить: Моя тестовая программа в основном представляет собой форму с полосой прокрутки (от 0 до 100), в которой есть обработчик события при изменении, чтобы установить прозрачность формы на основе значения полосы прокрутки. Это мясо этого:

private void trackBar1_Scroll(object sender, EventArgs e)
{
    double opacity = ((double)trackBar1.Value) / 100;
    this.Opacity = opacity;
}

Прекрасно работает в Windows.

1 ответ

Решение

У вас действительно есть все, что вам нужно с compiz,

настройка Window.Form.Opacity следует установить свойство X window _NET_WM_WINDOW_OPACITY на окне;

Чтобы проверить, работает ли часть Ubuntu, попробуйте установить непрозрачность вручную на 0,5 с помощью этой команды низкого уровня (щелкните окно):

$ xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 0x7fffffff

И вернемся к полной непрозрачности:

$ xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 0xffffffff


Один способ, как установка Window.Form.Opacity может произойти сбой в том, что он выбирает неправильное (но тесно связанное) окно и устанавливает там его свойство.


По вашим комментариям идея была правильной. Добавление:

Я подозреваю, что это очень специфическая ошибка, которая существует и в других программах: окно, выбранное для того, чтобы сделать его прозрачным, определяется некоторыми эвристиками, основанными на том, как X-окна декоратора окна и приложения связаны / вложены и т. Д. Но с Внедрение переучивания WM привело к большим изменениям в этой области - с радостью эвристика все еще работала. Из того, что я понимаю, это случай неудачной эвристики, так что какое-то невидимое окно рядом будет прозрачным...

Посмотрите на эту ошибку, чтобы понять больше проблемы: transset не может изменить свойство _NET_WM_WINDOW_OPACITY

Другие вопросы по тегам