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]
