tincho   19-02-2024, 00:15
#1
Hola, hace unos días que vengo con esta función que intenta listar los programas por defecto dedicados a una tares determinada.
Hice la función porque en algunas ocasiones cuando en gambas enviaba una orden de abrir un directorio sucedía otra cosa distinta a abrir el directorio en el gestor de archivos.
Así que les acerco la funcion por si tal vez les resulta de utilidad.
Código:
'' This function list all the .desktop applications in the directory /usr/share/applications which are asociated to al the mimetypes in the frirst argument and optionally is possible filter by category.
Static Public Function DeskApp2(aMimeType As String[], Optional aCategories As String[]) As DesktopFile[]
  Dim oTemp As DesktopFile[]
  Dim oDsk As New DesktopFile[]
  Dim oDsk2 As New DesktopFile[]
  Dim dsk As DesktopFile
  Dim sDef As String
  Dim ad As New String[]
  Dim sMime As String
  Dim sApps As String
  Dim xapp As DesktopFile
  Dim mk As String
  Dim sKat As String
  Dim sl As String
  Dim sApp As String
  If aMimeType.Count Then
    For Each mk In aMimeType
      oTemp = DesktopFile.FromMime(mk)
      For Each dsk In oTemp
        If aCategories.Count Then
          For Each sKat In aCategories
            If dsk.Categories.Exist(sKat) Then
              oDsk.Add(dsk)
              Break
            Endif
          Next
        Else
        Endif
      Next
    Next
  Endif
  Select Desktop.Type
    Case "KDE"
      sDef = User.Home &/ ".config/kde-mimeapps.list"
    Case "LXQT"
      sDef = User.Home &/ ".config/lxqt-mimeapps.list"
    Case "GNOME", "MATE", "ENLIGHTENMENT", "WINDOWMAKER", "XFCE"
      sDef = User.Home &/ ".config/mimeapps.list"
  End Select
  If Exist(sDef) Then
    Select Stat(sDef).Type
      Case gb.File, gb.Link
        ad = Split(File.Load(sDef), "\n")
        If ad.Count > 0 Then
          For Each sl In ad
            If InStr(sl, "=") > 0 Then
              sMime = Split(sl, "=")[0]
              sApps = Split(sl, "=")[1]
              If InStr(sApps, ";") Then
                For Each sApp In Split(sApps, ";")
                  If sApp <> "" Then
                    For Each xapp In oDsk
                      If File.Name(xapp.Path) = sApp Then
                        oDsk2.Add(xapp)
                      Endif
                    Next
                  Endif
                Next
              Endif
            Endif
          Next
        Endif
    End Select
    For Each xapp In oDsk
      If Not oDsk2.Exist(xapp) Then
        oDsk2.Add(xapp)
      Endif
    Next
  Else
    oDsk2 = oDsk
  Endif
  Return oDsk2
End

Para llamar la función hay dos parámetros que se le deben pasar, mas bien uno solo, el segundo es opcional pero en ocasiones es necesario si se desea filtrar aplicaciones que no pintan nada en el asunto.
Por ejemplo yo tenia que abrir un directorio en el gestor de archivos y aparecía EasyTag, el programa de edición de metadatos de los mp3.

Código:
    o = System.DeskApp2(["text/plain"], ["TextEditor"]) ' Con esto llamo la funcion, le paso los parametros en forma de 2 String[] y luego con la lista de objetos puedo obtener los datos
    Print o[0].ProgramName
    Print o[0].Name

1 Saludo.
Shell   20-02-2024, 00:41
#2
Esto hay que verlo con detenimiento. Se ve muy interesante. Smile

Ostras si que es complejo el bucle.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   20-02-2024, 12:37
#3
(19-02-2024, 00:15)tincho escribió: Para llamar la función hay dos parámetros que se le deben pasar, mas bien uno solo, el segundo es opcional pero en ocasiones es necesario si se desea filtrar aplicaciones que no pintan nada en el asunto.

Si no se le pasa el segundo parámetro. Acategories puede ser nulo. Y si le paso al parámetro de entrada Acagetories un valor como por ejemplo [""],
devuelve valores, que puede no ser lo que estamos buscando.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.