A opacidade da janela para formulários Mono é suportada?

2

Estou desenvolvendo um programa multiplataforma usando Mono e requer suporte a Opacidade de Formulário. Basicamente, a capacidade de tornar uma janela semitransparente. Isso funciona bem no windows, definindo a propriedade Window.Form.Opacity para dizer 0.5. No Ubuntu 14.04, no entanto, não funciona de imediato. Acho que estou executando o Unity e o Compiz, o que veio com a configuração padrão do Ubuntu.

De acordo com a FAQ do Mono, isso deve ser suportado:

  

Como posso fazer minhas janelas alfa misturadas? (transparente)

     

A implementação do Mono Winform oferece suporte à transparência em suas janelas   desde que o sistema de janelas subjacente tenha suporte para ele.

     

Para usuários do Unix / X11, isso significa que eles devem ter o COMPOSITE   extensão ativada em seu servidor, e eles devem estar executando   gerenciador de composição, como xcompmgr.

     

O Wiki do GenToo Linux tem uma boa descrição de como configurar o Xorg   servidor para suporte à transparência.

link

O link para o qual eles apontam está morto.

Sou novo no Linux e não tenho certeza de que entendi todas as partes envolvidas na ativação e execução de um gerenciador de janelas de composição. Além disso, eu já não tenho um (compiz?)

O que devo tentar fazer com que a minha opacidade do Winform funcione?

Editar: Meu programa de teste é basicamente um formulário com uma barra de rolagem (de 0 a 100) que possui um manipulador de eventos em alteração para definir a opacidade do formulário com base no valor da barra de rolagem. Esta é a carne dele:

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

Funciona muito bem no Windows.

    
por Cubicle Dragon 28.08.2014 / 02:02

1 resposta

1

Você realmente tem tudo o que precisa com compiz .

A configuração de Window.Form.Opacity deve definir a propriedade da janela X _NET_WM_WINDOW_OPACITY na janela;

Para um teste se a parte do ubuntu funciona, tente configurar a opacidade manualmente para 0.5 com este comando de baixo nível (clique na janela):

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

E de volta à opacidade total:

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


Uma forma como a configuração Window.Form.Opacity pode falhar é que ela escolhe uma janela errada (mas intimamente relacionada) e define a propriedade lá.

De acordo com seus comentários, a ideia estava certa. Adicionando:

Eu suspeito que é um erro muito específico que existe em outro software também: A janela que é escolhida para torná-la transparente é encontrada por algumas heurísticas baseadas em como as janelas X do decorador de janelas e o aplicativo estão relacionados / aninhados, etc. Mas com a introdução da WM reparadora, houve muita mudança na área - de bom grado as heurísticas ainda funcionavam. Pelo que entendi, este é um caso de falha na heurística, de modo que alguma janela invisível próxima será transparente ...

Veja este bug para entender mais o problema: transset não muda o _NET_WM_WINDOW_OPACITY propriedade

    
por Volker Siegel 28.08.2014 / 02:28