Vamos apenas perguntar o código fonte. Se você não está interessado nos detalhes, basta pular para o final para ver o resultado:
Existe um KCM para definir os aplicativos padrão. Vamos procurar seu nome:
$ kcmshell4 --list | ack -i default
componentchooser - Choose the default components for various services
NOTA: Os 5 passos seguintes são específicos do Gentoo, mas podem ser aplicados a qualquer outra distribuição ou podem ser substituídos navegando manualmente pelos repositórios de código do KDE!
Vamos procurar no sistema de arquivos por arquivos pertencentes ao componentchooser
:
$ find /usr -name "*componentchooser*"
/usr/lib64/kde4/kcm_componentchooser.so
/usr/share/doc/HTML/en/kcontrol/componentchooser
/usr/share/doc/HTML/de/kcontrol/componentchooser
/usr/share/kde4/services/componentchooser.desktop
/usr/share/apps/kcm_componentchooser
/usr/share/locale/de/LC_MESSAGES/kcmcomponentchooser.mo
Agora vamos consultar o gerenciador de pacotes (no nosso caso o Portage do Gentoo) e pedir o pacote que contém qualquer um desses arquivos:
$ find /usr -name "*componentchooser*" | xargs qfile
kde-base/kdelibs (/usr/share/apps/kcm_componentchooser)
kde-base/kcontrol (/usr/share/apps/kcm_componentchooser)
kde-base/kcontrol (/usr/share/kde4/services/componentchooser.desktop)
kde-base/kcontrol (/usr/share/doc/HTML/en/kcontrol/componentchooser)
kde-base/kcontrol (/usr/lib64/kde4/kcm_componentchooser.so)
kde-base/kde-l10n (/usr/share/locale/de/LC_MESSAGES/kcmcomponentchooser.mo)
kde-base/kde-l10n (/usr/share/doc/HTML/de/kcontrol/componentchooser)
Como estamos procurando o código-fonte que realmente grava o valor para o navegador padrão, devemos examinar o arquivo .so
que contém o código real, enquanto os outros arquivos apenas fornecem documentação ( /usr/share/doc/[…]
), meta-informação ( […].desktop
) e strings de tradução ( /usr/share/locale/[…]
).
Isso significa que teremos que dar uma olhada no pacote que fornece o arquivo objeto compartilhado ( .so
), que é kde-base/kcontrol
no Gentoo.
Primeiro, temos certeza de que o tarball de origem está presente em nosso sistema de arquivos, pedindo ao Portage para baixá-lo para este pacote ( --nodeps
garante, somente as fontes desse pacote são baixadas, mas não para nenhuma dependência):
$ emerge --fetchonly --nodeps kde-base/kcontrol
>>> Fetching (1 of 1) kde-base/kcontrol-4.11.4
* kde-runtime-4.11.4.tar.xz SHA256 SHA512 WHIRLPOOL size ;-) ... [ ok ]
Nesse caso, o arquivo já estava presente e apenas as somas de verificação foram verificadas.
Agora vamos descompactar este arquivo em um local temporário para examiná-lo ainda mais:
$ cd /tmp
$ tar xf /usr/portage/distfiles/kde-runtime-4.11.4.tar.xz
O resultado é o diretório kde-runtime-4.11.4
no qual vamos mudar agora:
$ cd kde-runtime-4.11.4
Este diretório contém agora muitos componentes pertencentes ao pacote kde-runtime
do KDE SC. Estamos interessados no componente kcontrol
:
$ cd kcontrol
Agora, precisamos identificar o arquivo que contém o código-fonte para gravar o navegador padrão em kdeglobalsrc
. Existem diferentes maneiras de fazer isso:
- Navegue pela estrutura de diretórios e tente encontrar o arquivo pelo nome.
- Procure um arquivo cujo nome contenha algo como
componentchooser
e examine seu código-fonte - Verifique o código-fonte e localize diretamente o arquivo que grava o valor
BrowserApplication
.
O caminho mais curto para o nosso objetivo é a opção '3', e é isso que faremos:
$ ack BrowserApplication
componentchooser/componentchooserbrowser.cpp
50: QString exec = config.readPathEntry( QLatin1String("BrowserApplication"), QString("") );
92: config.writePathEntry( QLatin1String("BrowserApplication"), exec); // KConfig::Normal|KConfig::Global
Então, obviamente, na linha '92' do arquivo componentchooser/componentchooserbrowser.cpp
, esse é o valor que está sendo escrito, então vamos dar uma olhada mais de perto:
80 void CfgBrowser::save(KConfig *)
81 {
82 KConfigGroup config(KSharedConfig::openConfig("kdeglobals"), QLatin1String("General") );
83 QString exec;
84 if (radioExec->isChecked())
85 {
86 exec = lineExec->text();
87 if (m_browserService && (exec == m_browserExec))
88 exec = m_browserService->storageId(); // Use service
89 else if (!exec.isEmpty())
90 exec = '!' + exec; // Literal command
91 }
92 config.writePathEntry( QLatin1String("BrowserApplication"), exec); // KConfig::Normal|KConfig::Global
93 config.sync();
94
95 KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged);
96
97 emit changed(false);
98 }
Na linha '92', a chave BrowserApplication
é escrita e seu valor está na variável exec
. O ponto de exclamação é adicionado à string de comando na linha '90', mas não há nenhum comentário elaborado no código nessa linha, o que explicaria por que isso é feito, então vamos dar uma olhada na lógica de código que leva à adição um !
na frente do valor BrowserApplication
:
- A linha '86' define
exec
como a string fornecida pelo campo de entrada - Verificações de linha '87', se a variável de membro
m_browserService
é verdadeira e se o conteúdo da variávelexec
é o mesmo que a variável de membrom_browserExec
.-
m_browserService
é definido (0
ou1
) pelo método CfgBrowser :: selectBrowser quando o navegador padrão é selecionado, navegando na árvore de aplicativos em vez de inserir o nome do executável diretamente como string. Caso o navegador seja selecionado navegando na árvore de aplicativos, o conteúdo do campo de entrada é o nome do arquivo*.desktop
dos aplicativos. -
m_browserExec
é o nome do arquivo*.desktop
ao selecionar o navegador por meio da árvore de aplicativos. - Caso as duas instruções sejam avaliadas como
TRUE
,exec
será definido como o resultado destorageId
(o nome da entrada*.desktop
). - Caso contrário, o nome do arquivo executável é definido, mas é prefixado por um
!
.
-
Para resumir:
O ponto de exclamação para a entrada BrowserApplication
em kdeglobalsrc
é usado para distinguir entre um nome binário real a ser executado para iniciar o navegador ou o nome do arquivo *.desktop
de um navegador.