Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto.
Bueno, creo que lo tengo... más o menos.
Lo he conseguido jugueteando con los scripts de xdg-utils en la shell. El tema sería más o menos así:
tmp = Temp()
s = "cat /usr/share/applications/$(xdg-mime query default `xdg-mime query filetype \"" & docum & "\"`)|grep Exec=|cut -d= -f2|tail -1|sed 's/\\%U//'|sed 's/\\n//' >" & tmp
Shell s Wait
Es decir: averiguamos el tipo mime del fichero (xdg-mime query filetype); luego averiguamos qué lanzador de escritorio (.desktop) se usa para abrir ese tipo (xdg-mime query default); luego lo abrimos (cat); y buscamos la/s línea/s (hay archivos que tienen varias) donde aparezca Exec=; de estas líneas cogemos sólo la última (tail -1); esta linea la cortamos (cut) por el =; y cogemos la segunda mitad (f2); a ésta mitad le quitamos el %U (sed) que la mayoría de .desktop tienen; y el retorno de carro final (sed otra vez). El resultado es el nombre del programa lanzador y lo almacenamos en el archivo tmp.
para lanzar el programa usamos otra llamada a shell o exec:
Y, ahora sí, por fín, nuestro programa se detiene en tanto el proceso lanzado esté en marcha.
Hay un par de detalles con los que no estoy contento: No tengo la habilidad suficiente como para eliminar el %U (que puede estar o no) y el retorno de carro (que siempre está) con una sola expresión regular de sed. Por eso uso dos pero sospecho que se puede hacer con una. Si alguien me echa una mano en eso, genial.
La otra cosa es que esto funciona basado en el mimetype pero el algoritmo para averiguar el programa de un archivo es más complejo que el mimetype. A parte de la extensión se puede mirar el contenido del propio fichero, los metadatos si los hay, etc. etc. Por tanto la solución ésta no es perfecta.
Para mejorarla, en los casos que falle, le dejamos el trabajo a xdg-open (que es lo mismo que a gnome-open) que sí suele funcionar y controlamos "a pelo" la ejecución del proceso.
La función de abrir fichero y esperar a que se termine de editar o ver, por tanto, queda así:
Supongo que también en lugar de hacer el bucle basandonos en llamadas a ps -h ( Shell "ps -h " & id & " > " & tmp Wait ) Se podría crear un proceso y hacer el bucle basándonos en el estado del proceso (while mi proceso.running), pero me ha parecido más engorroso que hacerlo así y tampoco le veo la ventaja.
Aún sigue sin ser perfecta... pero para mis fines (abrir documentos de libreoffice e imágenes y vídeos como mucho), me vale.
Saludos.