Qual é a diferença entre .Xresources e .Xdefaults?

59

Esses dois arquivos parecem ter a mesma função. Qual é a diferença entre os dois, se houver?

freedrull
fonte

Respostas:

68

~/.Xdefaultsé o método mais antigo de armazenar recursos do X. Este arquivo é relido sempre que um programa Xlib é iniciado. Se o X11 for usado na rede, o arquivo deverá estar presente no mesmo sistema de arquivos que os programas.

~/.Xresourcesé mais novo. Ele é carregado xrdbna RESOURCE_MANAGERpropriedade da janela raiz do X11. Sempre que um programa procura um recurso, ele é lido diretamente RESOURCE_MANAGER.

Se essa propriedade não existir, o Xlib retornará ao método antigo de leitura .Xdefaultsem cada inicialização do programa. Observe que a maioria das distribuições carregará ~/.Xresourcesautomaticamente se estiver presente, fazendo .Xdefaultscom que seja ignorado, mesmo que você nunca tenha executado xrdbmanualmente.

A vantagem do novo método é que basta ligar xrdbuma vez e os recursos estarão disponíveis para qualquer programa em execução nessa tela, local ou remoto. (O nome ~/.Xresourcesé apenas uma convenção - você pode usar xrdbpara carregar qualquer arquivo, até .Xdefaults.)

Manual de programação Xlib P.441:

Antes do X11R2, as configurações de recursos do X eram lidas no arquivo .Xdefaults no diretório inicial do usuário e, opcionalmente, em qualquer máquina em que o cliente X estivesse executando, portanto, era difícil manter vários arquivos.

Posteriormente, o programa xrdb foi criado para armazenar as configurações de recursos dos usuários em .Xresources na propriedade XA_RESOURCE_MANAGER da janela raiz no servidor X atual, para que todos os clientes conectados ao mesmo servidor tenham acesso a eles. Se o usuário não tiver chamado o xrdb para definir a propriedade, o .Xdefaults será lido.

Wikipedia :

[...] os recursos X são armazenados em dois locais padrão, dependendo se eles se aplicam a todas as telas ou a uma determinada:

  • a propriedade RESOURCE_MANAGER da janela raiz da tela 0
  • a propriedade SCREEN_RESOURCES da janela raiz de uma tela arbitrária

Não termina bem nisso.

  • Também existe a $XENVIRONMENTvariável, cujo padrão é se não estiver definido. Isso é usado da mesma maneira que , mas é sempre lido, independentemente de estar presente. Você pode usar arquivos para manter algumas configurações específicas da máquina enquanto usa para as globais.~/.Xdefaults-hostname.XdefaultsRESOURCE_MANAGER.Xdefaults-hostnamexrdb

Os itens 4 e 5 listados abaixo parecem ser usados ​​apenas por programas Xlib puros - não pelo GTK 3 ou outros kits de ferramentas.

  • O quarto local é o diretório apontado pela $XAPPLRESDIRvariável de ambiente. (Estranhamente, se a variável não estiver definida, $HOMEserá usada como padrão.) Quando um programa é iniciado, verifica se existe algum dos seguintes arquivos (o nome do arquivo é o mesmo que o nome da classe do programa):

    • $XAPPLRESDIR/$LC_CTYPE/XTerm
    • $XAPPLRESDIR/language/XTerm
    • $XAPPLRESDIR/XTerm

    ( languageé derivado da $LC_CTYPEremoção de todos, exceto o primeiro componente; por exemplo, en_US.utf-8en.)

  • O quinto local são os diretórios "app-defaults" em todo o sistema. Novamente, os diretórios de padrões do aplicativo são verificados na inicialização do programa se eles tiverem um arquivo com o nome do programa. Por exemplo, o XTerm (no Arch Linux) usa:

    • /etc/X11/$LC_CTYPE/app-defaults/XTerm
    • /etc/X11/language/app-defaults/XTerm
    • /etc/X11/app-defaults/XTerm
    • /usr/share/X11/$LC_CTYPE/app-defaults/XTerm
    • /usr/share/X11/language/app-defaults/XTerm
    • /usr/share/X11/app-defaults/XTerm

    Os arquivos de padrões do aplicativo geralmente são instalados /usr/sharejunto com o próprio programa; as substituições de administrador iriam para /etc.


Tudo o que foi mencionado acima está documentado em grande detalhe na documentação do kit de ferramentas do X.org - artigo Intrinsics X Toolkit - Interface de linguagem C , seção Carregando o banco de dados de recursos .

Infelizmente, não consegui encontrar nenhum guia do usuário recente que descreva os recursos do X, principalmente porque são irrelevantes no ano de 2012. Mas, para obter informações históricas (leia-se: terrivelmente desatualizadas), você pode ler o guia do usuário do X Window System para X11 R3 e R4 da seção 9 do sistema X Window : Configurando recursos (iniciando na página 181).

gravidade
fonte
Ótima resposta, mas deve-se notar que nem todas as implementações seguem as regras corretamente. Por exemplo, lembro que os aplicativos SunOS 4 e Solaris 6 não captariam alterações .Xdefaults, a menos que eu explicitamente executasse "xrdb" posteriormente. Também pode haver alguma estranheza quando o aplicativo e o servidor X estão sendo executados em hosts diferentes. Alguns aplicativos leem o arquivo local e outros leem o banco de dados do servidor X.
David C.
11
@ DavidD .: Esse comportamento do Xdefaults está seguindo as regras descritas acima. Se xrdbtem sempre sido gerido por esta exibição X desde o login - isto é, se a propriedade existe X raiz - então xlib não vai usar .Xdefaults em tudo mais.
grawity
11
Isso faz sentido. Mas ainda existem muitos aplicativos aparentemente borken que lêem o conteúdo de ~ / .Xresources e ignoram o banco de dados xrdb. O que pode ser realmente irritante se você entrar em um host diferente (que possui um .Xresources diferente) e descobrir que o aplicativo não está exibindo seu conteúdo da mesma forma que quando executado localmente.
David C.