Disponibilizei para download a primeira versao do QS em BASh + Xdialog:

<http://www.ceat.net/~arkanon/scripts/?shoooqs.sh>

Como gostaria de comentarios sobre o codigo, algoritmo e demais
informacoes colocadas no script, vou postar abaixo o codigo completo.

Na forma atual, ele tem 15279 bytes em 486 linhas.

[]

--

#!/bin/bash
# ATENCAO: nao modifique a linha acima. O script tem caracteristicas que
#          exigem que o shell seja executado como 'bash' e nao 'sh'.



    short="ShOOoQS"
pronuncia="xucs"
     long="Shell script OpenOffice.org QuickStarter"
  version="0.1"
     date="2008/01/30 (Qua) 15:37:23 (BRDT)"
   author="Arkanon"
    email="[EMAIL PROTECTED]"

  comment="
A ultima versao deste script pode ser obtida em
<http://www.ceat.net/~arkanon/scripts/?shoooqs.sh>

Eventualmente, mais coisas uteis/inuteis/curiosas sobre varios
assuntos podem vir a ser disponibilizadas (ou nao) em
<http://www.ceat.net/~arkanon/>
"



# [Licensa de Uso]
#
# Esse script eh distribuido sem nenhuma garantia, mas com a esperanca
# que possa vir a ser util a mais alguem. Eu nao assumo qualquer
# responsabilidade por qualquer dano fisico, logico ou moral que o uso
# dele possa acarretar na sua instalacao, maquina, rede ou cerebro.
# Utilize-o por sua propria conta e risco.
#
# Voce e livre para usar, copiar, modificar e passar adiante esse
# script; tudo o que eu peco eh que mantenha os creditos originais. Se
# encontrar erros ou tiver sugestoes que possam melhora-lo ou ajusta-lo
# a outras situacoes, sinta-se a vontade para publica-los ou envia-los
# para mim.



# [Versoes dos principais softwares usados no desenvolvimento do script]
#
#   - Slackware [[12.0]] *sem* GNOME
#   - Kernel [[2.6.24]] compilado com os parametros do Kernel Huge SMP
#     default do Slackware Current
#   - XOrg [[1.3.0]] com a extensao GLX ativada
#   - IceWM [[1.2.35]] oriundo do repositorio
#     <http://repository.slacky.eu/>
#   - Xdialog [[2.3.1]] para Slackware 10.2, oriundo do repositorio
#     <http://linuxpackages.net/>
#   - GNU sed [[4.1.5]]
#   - GNU bash [[3.1.17(2)]]
#   - BrOffice.org [[2.3 680m9(Build:9238), AKA 2.3.1rc1]] de
#     [[13/11/2007]] para Linux, oriundo do site <http://broffice.org/>
#   - conta de usuario comum
#
# Na sua maquina:
# (
#   cat /etc/slackware-version
#   gnome-about --version
#   uname -sr
#   Xorg  -version 2>&1 | head -2 | tail -1
#   Xorg :999 -probeonly -verbose 2>&1 | grep extensions
#   icewm --version
#   Xdialog --print-version
#   sed  --version  | head -1
#   bash --version  | head -1
#   soffice -h 2>&1 | head -1
#   whoami
# )



# [Consideracoes, Caracteristicas e Deficiencias]
#
#        "Bugs documentados tornam-se caracteristicas." :-p
#
# Antes de mais nada, uma rapida analise a cerca do uso nao apenas desse
# script, mas de qualquer iniciador rapido de qualquer aplicativo.
#
# Um iniciador rapido garante um aumento na velocidade de carregamento
# de um aplicativo a custa de uma determinada quantidade de memoria que
# fica destinada a conter uma instancia de parte do aplicativo, mas cuja
# efetiva utilizacao depende do usuario.
#
# Pode ser interessante ter a impressao que o aplicativo abriu mais
# rapido, mesmo que isso signifique perder parte da memoria quando ele
# nao estiver sendo utilizado. Ganha-se alguns segundos. Contudo,
# considerando que atualmente muitos SO's deixam aplicativos recem
# fechados num cache de disco em memoria (livre), a menos que
#    - o aplicativo esteja sendo executado pela primeira vez (desde que
#      o computador foi ligado), ou
#    - tenha sido fechado a muito tempo, ou;
#    - muita memoria tenha sido utilizada para outros fins, ou
#    - o cache tenha sido esvaziado,
# na pratica, nao fara diferenca deixar ou nao uma instancia escondida.
#
# Eh de se avaliar entao, se a relacao
#
#               custo (memoria) / beneficio (velocidade)
#
# nao fica alta demais. Vai depender da maquina que se tem (CPU-RAM-HD),
# da instalacao do aplicativo (local, CD, rede) e do uso que se faz
# dele.
#
# No caso do BrOffice.org [[2.3.1]] para Linux, que eh o aplicativo e
# plataforma para o qual esse script se destina, 21MB de RAM serao
# destinados a aceleracao da carga do programa.
#
# Se considerarmos esse script na sua forma mais crua, basicamente o que
# ele faz eh:
#
#  while true; do ps -C soffice.bin || soffice -nologo -nodefault; done
#
# Ou seja: enquanto nao ha uma instancia do OOo rodando, ele executa uma
# sem interface. Entao, quando executamos o OOo da forma tradicional, ja
# foram carregadas as bibliotecas mais pesadas e tudo o que ele precisa
# fazer eh carregar a UI (User Interface). Quando saimos da interface
# (fechamos o writer, calc, etc) ele finaliza tambem a instancia sem
# interface, e entao nao ha mais nenhum OOo rodando. Isso torna o loop
# infinito necessario.
#
# O ShOOoQS esta longe de ser perfeito, mas, dado o devido tempo e um
# numero suficiente de olhos, um dia ele sera ;-)
#
# 1. Para comecar, ele nao consegue diferenciar o processo do ooo sem
#    interfece do processo dos aplicativos do ooo. Quando se escolhe a
#    opção de sair, entao, se nao ha nenhum aplicativo do ooo aberto ou
#    seja, ha apenas o ooo sem ui, esse processo fica pendente em
#    background, e eh necessario mata-lo a mao. Se, tentando solucionar
#    esse problema, for usado o procedimento de matar o processo do ooo
#    na saida do script, entao, se houver aplicativos do ooo abertos,
#    eles eh que serao mortos ja que, uma vez executado algum aplicativo
#    do ooo, o ooo sem ui eh substituido pelo aplicativo.
#
#    Por outro lado, se ha algum aplicativo do ooo aberto e saimos do
#    ShOOoQS sem matar o processo, quando o ultimo aplicativo for
#    fechado, nao restara nenhum processo do ooo pendente. Nesse caso
#    nao ha problemas.
#
# 2. O uso de uma constante com o suposto tempo em que o ooo fica no
#    cache apos ser finalizado tambem nao eh o mais adequado. Certamente
#    esse tempo depende da memoria disponivel e dos aplicativos que
#    serao executados quando o ooo nao estiver mais rodando. A solucao
#    ideal eh conseguir verificar se o aplicativo ainda se encontra no
#    cache ou nao e, no segundo caso, executa-lo novamente. Seria uma
#    especie de 'ps', que ao inves de retornar o pid de processo em
#    execucao, retornaria o nome de processos que ainda permanecem em
#    cache. Aparentemente o comando 'lsof' eh capaz de fazer isso, mas
#    ate o momento nao descobri como. Desconheco qualquer ferramenta com
#    esse proposito especifico, e nao encontrei no Google nenhuma
#    referencia sobre o assunto, utilizando as palavras-chaves que
#    imaginei serem adequadas.
#
# 3. Ele foi criado especialmente para uso com o IceWM, mas nada impede
#    que seja utilizado (com eventuais adaptacoes) em qualquer outro WM.
#    A principal razao da sua criacao eh que o OOOQS2 eh feito para uso
#    no KDE, e portanto, ao ser executado por outro WM, carrega junto
#    inumeros processo especificos do KDE e indesejados, no meu caso.
#    Para que ele rode no IceWM de forma semelhante ao OOOQS2 ou o
#    QuickStarter do Windows, eh necessario associar a classe da janela
#    do menu em Xdialog a algum icone e seta-la para que fique no tray
#    menu:
#
#        cp -a <path_para>/shoooqs_16x16.xpm /usr/share/icewm/icons/
#
#        cat << EOT >> /usr/share/icewm/winoptions
#        # <http://www.icewm.org/manual/icewm-14.html>
#        shoooqs.icon: shoooqs
#        shoooqs.allWorkspaces: 1
#        shoooqs.ignoreQuickSwitch: 1
#        shoooqs.tray: Exclusive
#        shoooqs.layer: OnTop
#        shoooqs.geometry: -0+0
#        shoooqs.fClose: 0
#        shoooqs.dClose: 0
#        shoooqs.fMaximize: 0
#        shoooqs.dMaximize: 0
#        shoooqs.fMove: 0
#        shoooqs.dMove: 0
#        shoooqs.fResize: 0
#        shoooqs.dResize: 0
#        shoooqs.fHide: 0
#        shoooqs.dHide: 0
#        shoooqs.fRollup: 0
#        shoooqs.dRollup: 0
#        shoooqs.fTitleBar: 0
#        shoooqs.dTitleBar: 0
#        EOT
#
#    Acrescentar em '/etc/X11/xinit/xinitrc.icewm':
#        shoooqs &
#
# 4. Por default, a janela do menu aparece sempre centralizada na tela.
#    O ideal eh que apareca proximo ao tray menu. Esse problema foi
#    resolvido usando o parametro shoooqs.geometry no arquivo winoptions
#    do IceWM.
#
# 5. A janela do menu deveria minimizar automaticamente ao entrar no
#    IceWM e apos a selecao de alguma opcao.  Talvez seja possivel fazer
#    isso usando alguma ferramenta de linha de comando para controle de
#    janelas de WM's que seguem o padrao "FreeDesktop"
#    <http://www.freedesktop.org/>.
#
# 6. A selecao de opcoes precisa de dois cliques, ou um clique na opcao
#    e um clique no botao 'Executar'.  Eh uma caracteristica do Xdialog,
#    mas o ideal eh poder selecionar a opcao com um unico clique.
#
# 7. Conforme a versao do seu pacote do Xdialog e a configuracao do seu
#    sistema, voce pode ter problemas com caracteres ISO-Latinos. O
#    Pacote 'yudit' <http://linuxpackages.net/> possui uma ferramenta
#    chamada 'uniconv', que realiza conversao entre os mais variados
#    conjuntos de caracteres.  ATENCAO: muitas distribuicoes possuem uma
#    ferramenta chamada uniconv, que provavelmente pertence ao pacote
#    netatalk e nao eh o mesmo uniconv do yudit.
#
# 8. A opcao de reiniciar o ShOOoQS esta comentada. Ela ainda nao
#    funciona satisfatoriamente. Servira para recarregar o script quando
#    seu codigo fonte for alterado.



# Por quanto tempo o aplicativo permanece em cache apos ser finalizado?
time_in_cache=5         # minutos



# Acrescente ou remova (#) opcoes do menu alterando a variavel abaixo.
# Sintaxe: ^[ #](tag)\t+(label)$
actions="
 -writer        Novo Texto (Writer)
 -calc          Nova Planilha (Calc)
 -impress       Nova Apresentação (Impress)
 -draw          Nova Imagem Vetorial (Draw)
 -math          Nova Fórmula Matemática (Math)
 -base          Novo Banco de Dados (Base)
 -web           Novo Documento HTML
 -global        Novo Documento Mestre

 open           Abrir documento
 open -n        Abrir documento como modelo
 open -pt       Abrir documento para impressão
 open -view     Abrir documento no modo readonly
 open -show     Abrir apresentação para vizualização

 spadm          Gerenciamento de Impressoras

 help           Ajuda
 about          Sobre o $short
#restart        Reiniciar o $short
#quit           Sair do $short
"



   help="
Para executar uma opção, dê um duplo clique na opção ou a selecione \
e clique em 'OK'.
Para sair do Iniciador Rápido, execute a opção 'Sair' ou clique em \
'Cancelar' ou feche a janela.
"



   gray="0.875 , 0.875 , 0.875"
   blue="0.00 , 0.00 , 1.00"
  gtkrc="
# <http://www.gtk.org/api/2.6/gtk/gtk-Resource-Files.html>
style 'theme'
{
    fg[SELECTED] = { $blue }  # frente do  item selecionado do menu
    bg[SELECTED] = { $gray }  # fundo  do  item selecionado do menu
  base[NORMAL  ] = { $gray }  # fundo  dos itens do menu
  base[ACTIVE  ] = { $gray }  # bordas dos itens do menu
}
widget '*' style 'theme'
"



 script=`basename $0`
    tmp="/tmp/$script.$$"



about()
{
  title="Sobre o $short"
  Xdialog \
   --title "$title" \
   --backtitle "$title" \
   --left \
   --msgbox "$short ($pronuncia) - $long\nv$version - $date\n\n
$author <$email>\n\n$comment" 0 0
}



help()
{
  title="Como usar o $short"
  Xdialog \
   --title "$title" \
   --backtitle "$title" \
   --left \
   --msgbox "$help" 0 0
}



unknown()
{
  title="Erro"
  Xdialog \
   --title "$title" \
   --backtitle "$title" \
   --left \
   --msgbox "\nAção desconhecida.\n" 0 0
}



open()
{

  lp=""

  if [ "$1" = -pt ]
  then
    def_lp=`lpstat -d | cut -d\  -f4`
    lplist=`lpstat -a | cut -d\  -f1`
    lplist=`paste <(echo "$lplist") <(echo "$lplist")`
       nlp=`echo "$lplist" | wc -l`
     title="Impressora"
      text="Selecione a impressora"
    echo "$gtkrc" | Xdialog \
                    --title "$title" \
                    --rc-file /dev/stdin \
                    --no-tags \
                    --default-item $def_lp \
                    --menubox "$text" 0 0 $[$nlp+1] \
                    $lplist \
                    2>| $tmp.lp
    retval=$?
    lp=`cat $tmp.lp`
    case $retval in
        0) echo -n "lp:$lp "    ;;
        1) echo -n "lp:cancel " ;;
      255) echo -n "lp:close "  ;;
    esac
  fi

  [ $retval = 0 ] || Xdialog --title "Impressão" \
                             --msgbox "\nImpressão cancelada.\n" 0 0

  if [ "$1" = -pt -a $retval = 0 ] || [ "$1" != -pt ]
  then
      dir=`cat $tmp.dir 2> /dev/null || echo $HOME`
    title="Selecione o arquivo"
     file=`Xdialog --title "$title" --fselect $dir 40 80 2>&1`
    if [ -e "$file" ]
    then
      echo -n "file:$file "
      dirname $file >| $tmp.dir
      soffice $1 $lp $file
    fi
  fi

}



echo -e "\n$script trace:"



i=1
while true
do
# Se nao ha nenhuma instancia do ooo rodando
  if ! ps -C soffice.bin &> /dev/null
  then
  # Executa-o e incrementa a contagem de vezes que ele ja foi executado
    echo -en "\n$i: "
    soffice -nologo -nodefault &> /dev/null
    ((i++))
  fi
# Espera um tempo arbitrario para realizar novamente o teste (e
# eventualmente re-executar o ooo). O tempo deve ser aproximadamente o
# tempo que um aplicativo, apos terminado, permanece no buffer de disco
# na memoria.
# Essa caracteristica do SO de manter aplicativos recem fechados na
# memoria, aliada a esse artificio, diminui o efeito do loop infinito
# sobre o processador.
  sleep $[$time_in_cache*60]
done &



(

  sed_code='
s/^[ \t]*//
s/[ \t]*$//
s/\([ \t]\)\+/\1/
s/^$/sep\t/
/^#/d
s/^/"/
s/$/" \\/
s/\t/"\t"/
1d
$d
'


     title="$short"
      text="$short"
   actions=`echo "$actions" | sed "$sed_code"`
     texth=$[`echo -e "$text"    | wc -l`]
     menuh=$[`echo -e "$actions" | wc -l`-1]
     width=34
    height=$[$texth+$menuh+9]

  while true
  do

    echo "$gtkrc" | eval "Xdialog \
                    --title \"$title\" \
                    --wmclass \"shoooqs\" \
                    --ok-label \"Executar\" \
                    --cancel-label \"Sair\" \
                    --rc-file /dev/stdin \
                    --no-tags \
                    --menubox \"$text\" $height $width $menuh \
                    $actions
                    2>| $tmp.action"
    retval=$?
    action=`cat $tmp.action`

    pid=`ps ho pid -C soffice.bin`
    echo -n "($pid) "

    case $retval in
        0) echo -n "$action "
           case $action in
               sep) ;;
             open*) $action & ;;
             spadm) spadmin &> /dev/null & ;;
              help) help ;;
             about) about ;;
#          restart) echo "DISPLAY=$DISPLAY $script" | at now ; break ;;
#             quit) echo; break ;;
                -*) soffice -nologo $action &> /dev/null & ;;
                 *) unknown ;;
           esac ;;
        1) echo "sair"  ; break ;;
#     255) echo "close" ; break ;;
    esac

# Este loop infinito fica trancado na janela de menu do Xdialog ate que
# alguma opcao seja selecionada, portanto nao tem efeitos nocivos sobre
# o processador que precisem de sleep para serem amenizados.

  done

  echo

  rm -f $tmp.*

# Ao sair do ShOOoQS, termina tambem os processos relativos ao ooo.
# Perigoso, pois pode finalizar inadvertidamente aplicativos do ooo com
# documentos nao salvos.
#
# killall -9 sleep soffice.bin spadmin.bin $script &> /dev/null

# Ao sair o ShOOoQS, finaliza apenas os processos relativos ao script
# propriamente dito. Inadequado, pois ao sair sem nenhuma tela de
# aplicativo do ooo aberta, mantem um processo do ooo consumindo memoria
# que nao sera liberada automaticamente.
#
  killall -9 $script &> /dev/null

)

# EOF

--
------------------------    __o    [EMAIL PROTECTED]  ----.-----------
 [EMAIL PROTECTED] Roberto Bagatini   _`\<,    www.ceat.net/~arkanon  \
  -=---=---==---=---=-   (_)/(_)   Phone +55 51 3748 7000  `--------
 Lajeado - RS - Brasil  ---------  ICQ 34 789 30 - LinuxUser 102.514
---------------------------------------------------------------------



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Responder a