Integrar/Sincronizar Firefox/Thunderbird com o KDE

Publicado por Claudio Polegato Junior 08/04/2005

[ Hits: 5.607 ]

Download criar_mime.types




Quando clico sobre um arquivo em uma página no Firefox ou anexo no Thunderbird sempre preciso escolher um programa para abrí-lo, mas este já tem um padrão no KDE. Pensando nisso (e no usuário final),  li um pouco da documentação de como é feita a associaçao no KDE e nos Mozilla's Softwares, dei uma raqueada e construi um script que sincroniza o programa padrão que escolho ou já vem pré-configurado no KDE para ser uma opção pronta no Firefox e no Thunderbird.

  



Esconder código-fonte

#!/bin/bash

######################################################
#                                                    #
#  Programa: criar_mime.types                        #
#     Autor: Claudio Polegato Junior                 #
#    Versão: 0.1                                     #
#      Data: 7 de Abril de 2004                      #
#                                                    #
######################################################

################################################################################
#                                                                              #
#     Quando clico sobre um arquivo em uma página no Firefox ou anexo no       #
# Thunderbird sempre preciso escolher um programa para abrí-lo, mas este já    #
# tem um padrão no KDE. Pensando nisso (e na impossibilidade de um usuário     #
# final - mas final mesmo - encontrar o programa correto no sistema de         #
# arquivos do linux), li um pouco da documentação de como é feita a associaçao #
# no KDE e nos Mozilla's Softwares, dei uma raqueada e construi um script que  #
# sincroniza o programa padrão que escolho ou já vem pré-configurado no KDE    #
# para ser uma opção pronta no Firefox e no Thunderbird.                       #
#                                                                              #
#     Este script faz basicamente uma varredura sobre os "mime types" (tipos   #
# que especificam o conteúdo o arquivo) com .desktop contidos nos diretórios   #
# ~/.kde/share/mimelnk (tipos definidos ou alterados pelo usuário),            #
# $KDEDIR/share/mimelnk (tipos padrões do KDE) e /usr/share/mimelnk (tipos que #
# alguns outros softwares definem no Linux). Dessa varredura são então         #
# encontrados os "mime types" e as extensões que estão associadas (isso é uma  #
# tentativa que faço e aparentemente dá certo).                                #
#     Para cada "mime type" encontrado, primeiramente é verificado se este     #
# consta no arquivo ~/.kde/share/config/profilerc (definido pelo usuário e     #
# contém uma lista dos "mime types" seguida por um traço e um número e então   #
# propriedade associadas a esta prioridade de "mime type") ou no arquivo       #
# $KDEDIR/share/config/profilerc (global para o KDE e características ídem ao  #
# anterior). Se for encontrado em um destes arquivos, é escolhido o link para  #
# aplicativo (.desktop) de prioridade 1, senão realiza uma varredura nos links #
# para aplicativos definidos no KDE constantes nos diretórios                  #
# ~/.kde/share/applnk (links definidos pelo usuário) e em $KDEDIR/share/applnk #
# (links globais do KDE), ondem é verificado em cada link se há uma referencia #
# para o "mime type" em questão e cria-se uma lista destes links. A partir     #
# desta lista, verifica-se qual tem o maior valor na propriedade               #
# InitialPreference e este então é dado como o link padrão. Caso houver empate #
# na ordenaçao por InitialPreference, pega o primeiro da lista como link       #
# padrão. Caso não encontre InitialPreference em nenhum, pega o primeiro da    #
# lista para ser o link padrão.                                                #
#     A partir deste arquivo de link padrão encontrado, procura-se a propriede #
# Exec, a qual indica o programa a ser usado para abrir o arquivo que casa com #
# o "mime type" que está sendo analisado.                                      #
#     Ufa! Neste ponto tenho um "mime type", as extensões associadas com ele e #
# o programa padrão utilizado pelo KDE. Então crio uma entrada no arquivo      #
# ~/.mime.types (primeiro o "mime type" e depois as extensões separadas por    #
# espaço) e no arquivo ~/.mailcap (primeiro o "mime type" e depois o programa  #
# separados por ponto e vírgula - ; - e terminado por %s).                     #
#     Fazendo-se isso para cada "mime type" do KDE consigo associar os         #
# programas padrões do KDE para ser o padrão no Firefox e no Thunderbird. Cada #
# vez que se altera o programa padrão no KDE ou insere um tipo novo deve-se    #
# rodar este script para fazer o sincronismo real sem ser necessário sair e/ou #
# reiniciar o Firefox e/ou o Thunderbird.                                      #
#                                                                              #
#     Espero que seja útil para a comunidade...                                #
#                                                                              #
################################################################################


if [ -a ~/.mime.types ]; then
  mv ~/.mime.types ~/.mime.types_`date +"%Y.%m.%d_%H.%M.%S"`
fi
if [ -a ~/.mailcap ]; then
  mv ~/.mailcap ~/.mailcap_`date +"%Y.%m.%d_%H.%M.%S"`
fi

# Mime type modified by current user
MIME_USER_DESKTOP=`find ~/.kde/share/mimelnk -name "*.desktop"`

# Mime type global from KDE
MIME_GLOBAL_DESKTOP=`find $KDEDIR/share/mimelnk -name "*.desktop"`

# Mime type global from Linux
MIME_LINUX_DESKTOP=`find /usr/share/mimelnk/application  -name "*.desktop"`

echo
echo "******************************"
echo "*****     User Space     *****"
echo "******************************"
echo

for MIME_DESKTOP in $MIME_USER_DESKTOP; do
  MIME=`expr "$MIME_DESKTOP" : '.*mimelnk/\(.*\).desktop'`
  echo "Mime: $MIME"
  EXTS=`grep "Patterns\=" "$MIME_DESKTOP" | sed s/Patterns=// | sed s/'*'//g | sed s/'\.'//g | sed y/\;/' '/`
  echo "Exts: $EXTS"
  PROFILE=""
  PROFILERC="$HOME/.kde/share/config/profilerc"
  if [ -a "$PROFILERC" ]; then
    PROFILE=`expr "\`grep -n "$MIME - 1" "$PROFILERC"\`" : '\(.*\):.*'`
    if [ -z "$PROFILE" ]; then
      PROFILERC="$KDEDIR/share/config/profilerc"
      if [ -a "$PROFILERC" ]; then
        PROFILE=`expr "\`grep -n "$MIME - 1" "$PROFILERC"\`" : '\(.*\):.*'`
      fi
    fi
  fi
  if [ -z "$PROFILE" ]; then
    DESKTOPS=`grep -rl $MIME ~/.kde/share/applnk $KDEDIR/share/applnk`
    if [ -n "$DESKTOPS" ]; then
      LEVELS=`grep "InitialPreference" $DESKTOPS | rev | sort -r | rev`
      if [ -z "$LEVELS" ]; then
        for DESKTOP in $DESKTOPS; do
          break
        done
      else
        POS=`expr index "$LEVELS" ':'`
        if [ $POS == 0 ]; then
          DESKTOP=`grep -l "InitialPreference" $DESKTOPS`
        else
          DESKTOP=`expr substr "$LEVELS" 1 \`expr $POS \- 1\``
        fi
      fi
    else
     DESKTOP=""
    fi
  else
    PROFILE=`expr $PROFILE \+ 2`
    DESKTOP=`expr "\`sed -n ${PROFILE}p "$PROFILERC"\`" : 'Application=\(.*\)'`
    DESKTOP="$HOME/.kde/share/applnk/$DESKTOP"
  fi
  if [ -n "$DESKTOP" ]; then
    PROG=`expr "\`grep '^Exec' "$DESKTOP"\`" : 'Exec=\(.*\)'`
    POS=`expr index "$PROG" ' '`
    if [ "$POS" != "0" ]; then
      PROG=`expr substr "$PROG" 1 \`expr $POS \- 1\``
    fi
    PROG=`echo "$PROG" | sed s/"'"//g | sed s/'"'//g`
  fi
  echo "Prog: $PROG"
  echo
  if [ -n "$PROG" ]; then
    if [ -z "$EXTS" ]; then
      echo "$MIME" >> ~/.mime.types
    else
      echo "$MIME $EXTS" >> ~/.mime.types
    fi
    echo "$MIME;$PROG %s" >> ~/.mailcap
  fi
done

echo
echo "********************************"
echo "*****     Global Space     *****"
echo "********************************"
echo

for MIME_DESKTOP in $MIME_GLOBAL_DESKTOP; do
  MIME=`expr "$MIME_DESKTOP" : '.*mimelnk/\(.*\).desktop'`
  echo "Mime: $MIME"
  EXTS=`grep "Patterns\=" "$MIME_DESKTOP" | sed s/Patterns=// | sed s/'*'//g | sed s/'\.'//g | sed y/\;/' '/`
  if [ -a ~/.kde/share/mimelnk/$MIME.desktop ]; then
    echo "Exts: ***  Modified in User Space  *** $EXTS"
    echo
    continue
  fi
  echo "Exts: $EXTS"
  PROFILE=""
  PROFILERC="$HOME/.kde/share/config/profilerc"
  if [ -a "$PROFILERC" ]; then
    PROFILE=`expr "\`grep -n "$MIME - 1" "$PROFILERC"\`" : '\(.*\):.*'`
    if [ -z "$PROFILE" ]; then
      PROFILERC="$KDEDIR/share/config/profilerc"
      if [ -a "$PROFILERC" ]; then
        PROFILE=`expr "\`grep -n "$MIME - 1" "$PROFILERC"\`" : '\(.*\):.*'`
      fi
    fi
  fi
  if [ -z "$PROFILE" ]; then
    DESKTOPS=`grep -rl $MIME ~/.kde/share/applnk $KDEDIR/share/applnk`
    if [ -n "$DESKTOPS" ]; then
      LEVELS=`grep "InitialPreference" $DESKTOPS | rev | sort -r | rev`
      if [ -z "$LEVELS" ]; then
        for DESKTOP in $DESKTOPS; do
          break
        done
      else
        POS=`expr index "$LEVELS" ':'`
        if [ $POS == 0 ]; then
          DESKTOP=`grep -l "InitialPreference" $DESKTOPS`
        else
          DESKTOP=`expr substr "$LEVELS" 1 \`expr $POS \- 1\``
        fi
      fi
    else
     DESKTOP=""
     PROG=""
    fi
  else
    PROFILE=`expr $PROFILE \+ 2`
    DESKTOP=`expr "\`sed -n ${PROFILE}p "$PROFILERC"\`" : 'Application=\(.*\)'`
    DESKTOP="$HOME/.kde/share/applnk/$DESKTOP"
  fi
  if [ -n "$DESKTOP" ]; then
    PROG=`expr "\`grep '^Exec' "$DESKTOP"\`" : 'Exec=\(.*\)'`
    POS=`expr index "$PROG" ' '`
    if [ "$POS" != "0" ]; then
      PROG=`expr substr "$PROG" 1 \`expr $POS \- 1\``
    fi
    PROG=`echo "$PROG" | sed s/"'"//g | sed s/'"'//g`
  fi
  echo "Prog: $PROG"
  echo
  if [ -n "$PROG" ]; then
    if [ -z "$EXTS" ]; then
      echo "$MIME" >> ~/.mime.types
    else
      echo "$MIME $EXTS" >> ~/.mime.types
    fi
    echo "$MIME;$PROG %s" >> ~/.mailcap
  fi
done

echo
echo "*******************************"
echo "*****     Linux Space     *****"
echo "*******************************"
echo

for MIME_DESKTOP in $MIME_LINUX_DESKTOP; do
  MIME=`expr "$MIME_DESKTOP" : '.*mimelnk/\(.*\).desktop'`
  echo "Mime: $MIME"
  EXTS=`grep "Patterns\=" "$MIME_DESKTOP" | sed s/Patterns=// | sed s/'*'//g | sed s/'\.'//g | sed y/\;/' '/`
  if [ -a ~/.kde/share/mimelnk/$MIME.desktop ]; then
    echo "Exts: ***  Modified in User Space  *** $EXTS"
    echo
    continue
    if [ -a $KDEDIR/share/mimelnk/$MIME.desktop ]; then
      echo "Exts: ***  Modified in Global Space  *** $EXTS"
      echo
      continue
    fi
  fi
  echo "Exts: $EXTS"
  PROFILE=""
  PROFILERC="$HOME/.kde/share/config/profilerc"
  if [ -a "$PROFILERC" ]; then
    PROFILE=`expr "\`grep -n "$MIME - 1" "$PROFILERC"\`" : '\(.*\):.*'`
    if [ -z "$PROFILE" ]; then
      PROFILERC="$KDEDIR/share/config/profilerc"
      if [ -a "$PROFILERC" ]; then
        PROFILE=`expr "\`grep -n "$MIME - 1" "$PROFILERC"\`" : '\(.*\):.*'`
      fi
    fi
  fi
  if [ -z "$PROFILE" ]; then
    DESKTOPS=`grep -rl $MIME ~/.kde/share/applnk $KDEDIR/share/applnk`
    if [ -n "$DESKTOPS" ]; then
      LEVELS=`grep "InitialPreference" $DESKTOPS | rev | sort -r | rev`
      if [ -z "$LEVELS" ]; then
        for DESKTOP in $DESKTOPS; do
          break
        done
      else
        POS=`expr index "$LEVELS" ':'`
        if [ $POS == 0 ]; then
          DESKTOP=`grep -l "InitialPreference" $DESKTOPS`
        else
          DESKTOP=`expr substr "$LEVELS" 1 \`expr $POS \- 1\``
        fi
      fi
    else
     DESKTOP=""
     PROG=""
    fi
  else
    PROFILE=`expr $PROFILE \+ 2`
    DESKTOP=`expr "\`sed -n ${PROFILE}p "$PROFILERC"\`" : 'Application=\(.*\)'`
    DESKTOP="$HOME/.kde/share/applnk/$DESKTOP"
  fi
  if [ -n "$DESKTOP" ]; then
    PROG=`expr "\`grep '^Exec' "$DESKTOP"\`" : 'Exec=\(.*\)'`
    POS=`expr index "$PROG" ' '`
    if [ "$POS" != "0" ]; then
      PROG=`expr substr "$PROG" 1 \`expr $POS \- 1\``
    fi
    PROG=`echo "$PROG" | sed s/"'"//g | sed s/'"'//g`
  fi
  echo "Prog: $PROG"
  echo
  if [ -n "$PROG" ]; then
    if [ -z "$EXTS" ]; then
      echo "$MIME" >> ~/.mime.types
    else
      echo "$MIME $EXTS" >> ~/.mime.types
    fi
    echo "$MIME;$PROG %s" >> ~/.mailcap
  fi
done

Scripts recomendados

Organizar seus arquivos por pastas

Minha solução para monitorar múltiplos termômetros no Slackware

Manutenção de Endereços

Baixa, instala, configura e executa o NO-IP.

Simples Verificador de E-mail Gmail


  

Comentários
[1] Comentário enviado por Sukkubus em 08/04/2005 - 08:49h

Aeeeeee... vou indicar na Underlinux Girls tbm ;)

[2] Comentário enviado por cpolegatojr em 08/04/2005 - 16:22h

Acho que esqueci de dizer como fazer este script funcionar....
Basta fazer download do script, vá para o diretório onde salvou, torne-o executável (no shell, chmod +x criar_mime.types e no konqueror clique com o botão direito do mouse sobre o arquivo, clique depois em propriedade e então na aba permissões e dae marque todas as caixinhas da coluna Exec) e rode-o (no shell com ./criar_mime.types e no konqueror basta clicar - talves duplo - sobre o arquivo).

[]'s

Claudio

[3] Comentário enviado por cpolegatojr em 12/04/2005 - 12:46h

Olá, eu de novo... Seguinte, após resolver alguns erros reportados e otimizar o script, lancei uma versão 0.2 e esta já vem com suporte ao cron, isto é, pode ser incluído automaticamente pelo usuário no cron que a cada n minutos escolhidos verifica se é preciso fazer o sincronismo e se for o caso faz. Também está bem documentada no início.

[]'s

Claudio

[4] Comentário enviado por gbpenha em 02/06/2005 - 15:18h

Para adaptar esse script ao padrão de atalhos que estará sendo utilizado pelo KDE e pelo GNOME (eu já uso esse padrão aqui: os atalhos para os aplicativos ficam todos em /usr/share/applications, e quem manda em qual submenu ele vai ficar é sua categoria):
- Substitua as linhas originais que contém DESKTOPS (são 3 linhas):
DESKTOPS=`grep -rl $MIME ~/.kde/share/applnk $KDEDIR/share/applnk`
Por esta:
DESKTOPS=`grep -rl $MIME ~/.kde/share/applnk $KDEDIR/share/applnk /usr/share/applications`
Ou coloque o caminho da sua pasta applications de acordo com sua distro. Uso Kurumin aqui, e funcionou redondo! Valeu Claudio!

[5] Comentário enviado por cpolegatojr em 02/06/2005 - 17:38h

Obrigado pela dica, mas não tenho como testar aqui no GNOME ainda, mas quando sair a liberação SARGE do DEBIAN com certeza vou fazer os testes e soltar uma versão mais flexível onde seja possível identificar o ambiente em questão. Mas preste atenção no comentário que fiz acima que tem uma versão 0.2 com alguns erros/problemas corrigidos, mais otimizada e funciona através do cron, não sendo necessário rodar o script toda vez que houver uma alteração do programa padrão para o arquivo dado. Boa sorte!

[6] Comentário enviado por gbpenha em 02/06/2005 - 19:26h

Sim, já baixei a versão 0.2 também. Também funcionou perfeito com a dica q eu postei acima. No 0.2 fica mais fácil a modificação, porque o caminho das pastas está unificado em uma variável, assim, é só modificar em um lugar e pronto. Valeu de novo Cláudio!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts