Defina a meta-chave do gerenciador de janelas dependendo do Xserver conectado

7

Situação

Um servidor linux está executando um xdm suportando XDMCP, ele está conectado a várias caixas diferentes de Linux e OS X usando XDMCP através de um comando X -query <server> .

Uma vez que o usuário está logado, o gerenciador de janelas é iniciado, o qual é controlado principalmente pelo teclado usando uma meta-chave designada.

Problema

A meta key atribuída precisa depender da plataforma da caixa que se conecta ao servidor linux. Como faço para descobrir o que a plataforma está por trás do servidor X conectado?

Pensamentos

Eu não posso usar a variável de ambiente DISPLAY para ativar, os IPs das caixas de conexão são atribuídos pelo DHCP e não dão ideia de qual é a plataforma da caixa.

Eu sei que a opção -class para X pode ser usada para definir a classe de exibição, que então poderia ser usada para definir padrões para as várias classes de exibição no Xresources. No entanto, eu não sei como obter a classe do Xserver conectado a partir da linha de comando (ou um pequeno programa C personalizado) e, além disso, não sei como obter o valor de um Xresource que seria configurado com essa classe .

O ideal é que a meta key usada possa ser configurada na caixa que executa o servidor X, para que o servidor linux executando o xdm não precise de nenhuma reconfiguração quando um novo tipo de plataforma for introduzido na configuração.

Qual é a melhor maneira de fazer isso? É possível determinar a plataforma em que o servidor X está sendo executado? Alguma opção de configuração pode ser passada do Xserver para os scripts do gerenciador de janelas? Existe uma maneira melhor de resolver isso?

    
por wich 17.09.2012 / 13:29

1 resposta

1

Esse problema em particular seria fácil de resolver se você configurasse mapeamentos de teclado para que o mesmo keysym e modificador fosse atribuído à chave Meta em todos os lugares.

Você pode obter algumas informações sobre o servidor por meio do programa xrdb . O servidor define algumas propriedades que xrdb disponibiliza através do pré-processamento. Você pode imprimi-los com xrdb -symbols . Por exemplo,

xrdb -Dsymbols | sed -n 's/-DSERVERHOST=//p'

imprime o nome do host do servidor X. Você pode definir recursos específicos para um host de servidor específico com construções de pré-processamento de C:

#ifdef SRVR_darkstar
…
#endif

Aqui está um script de shell que transforma símbolos xrdb em variáveis de ambiente shell. Use-o com algo como eval "$(xrdb_sh_prefix=X_ xrdb-sh)" .

#!/bin/sh
# Access xrdb #define's from the shell

# For each binding that xrdb(1) would give to the preprocessor, print
# NAME=VALUE for -DNAME=VALUE.
# If $xrdb_sh_export is not empty, also print "export NAME".
# If $xrdb_sh_prefix is not empty, prefix it to each NAME in output.
# Shell metacharacters are preceded by '\' in VALUEs. NAMEs are
# assumed to be admissible C identifiers.
# Example:
#   xrdb_sh_export=y xrdb_sh_prefix=X_ xrdb-sh
# outputs somthing like
#    X_SERVERHOST=drongo
#    export X_SERVERHOST
#    X_VENDOR=The\ XFree86\ Project\,\ Inc
#    export X_VENDOR
# ...
# The output of this program is typically used in a Bourne shell thus:
#   eval "'xrdb_sh_prefix=X_ xrdb-sh'"

if [ -n "$xrdb_sh_export" ]; then
  awk_export='print "export " name'
fi
awk -v prefix="$xrdb_sh_prefix" '
  /^-D/ {
    $0 = substr($0, 3)
    eq = match($0, /=/)
    name = (prefix) (eq ? substr($0, 1, eq-1) : $0)
    if (eq) {
        $0 = substr($0, eq+1)
        sub(/^\"/, ""); sub(/\"$/, "")
        gsub(/[^0-9A-Z_a-z]/, "\\&")
    } else {
        $0 = ""
    }
    print name "=" $0
    '"$awk_export"'
  }
  /^exit=[0-9]+$/ {sub(/^.*=/, ""); exit $0}
' <<EOF
'{ xrdb "$@" -symbols || echo exit=$?; } | $sort || echo exit=$?'
EOF

Outra abordagem seria definir propriedades personalizadas na janela raiz do lado do servidor, por exemplo, com xprop . Consultar essas propriedades (novamente com xprop ) do lado do cliente.

xprop -set Server_arch "$(uname -m)"
    
por 18.09.2012 / 03:38