web-dev-qa-db-fra.com

Pourquoi certaines applications ouvertes apparaissent-elles comme des "points d'interrogation" dans le lanceur Unity?

J'ai un problème avec quelques programmes qui ont des lanceurs dans l'unité mais créent ensuite une icône distincte après avoir été lancés. Le lanceur peut-il suivre les fenêtres qu'il organise pour mieux s'organiser? Ou est-ce un bug dans Unity même?

enter image description here

Cela n'a peut-être pas d'importance, mais ce programme spécifique est un programme mono et l'icône créée apparaît sous la forme du panneau.

22
Andrew Redd

Que ce passe-t-il

Des problèmes de ce type ont trait au cadre de correspondance des applications de Unity. Pour simplifier les détails techniques, les fenêtres de programme et les applications sont deux choses distinctes pour Ubuntu. Ubuntu doit "deviner" quelle application possède une fenêtre particulière. Et parfois, cette hypothèse échoue et un point d'interrogation apparaît dans le lanceur.

L'échec peut être dû à:

  1. Un bogue dans BAMF (le cadre de correspondance d'application mentionné ci-dessus).
  2. Un fichier description de l'application (fichier '.desktop') défectueux.
  3. L'absence de description de l'application du tout. Les exécutables qui lancent des fenêtres ne possèdent pas intrinsèquement ces métadonnées.

L'application présentée dans la question (KeePass2) souffre d'un problème de type 1 qui a été signalé au gestionnaire de bogues approprié .

Exemples de problèmes

Les exemples ci-dessous sont techniques et s’adressent aux programmeurs qui souhaitent que leur propre application s’affiche correctement dans le lanceur Ubuntu.

Problème 3 - Pas de description d'application

Pour qu'une application s'intègre à Unity, c'est-à-dire qu'elle puisse être recherchée dans le tableau de bord et placée dans le programme de lancement, elle doit avoir une entrée de bureau. Ces entrées sont placées dans les codes /usr/share/applications/, /usr/local/share/applications/ et $HOME/.local/share/applications/ (les deux derniers étant respectivement destinés aux logiciels tiers, à l'échelle du système et à l'utilisateur uniquement). Ils se terminent par une extension .desktop et suivent le format de base suivant:

[Desktop Entry]
Type=Application
Name=My Application's Name
Icon=/file/path/of/my/icon
Exec=/file/path/of/my/executable

Cette entrée démarre un programme en appelant l'exécutable Exec. Chaque fois que ce programme affiche une fenêtre ou une boîte de dialogue, Unity remarquera que son exécutable "appartient" à cette description d'application et utilisera les noms Name et Icon dans le lanceur.

Ceci est un exemple à nu. Le spécification formelle couvre de nombreuses fonctionnalités avancées.

Problème 2 - Description de l'application défectueuse

Supposons que my_app.desktop existe dans un répertoire d'application valide, mais:

  • /file/path/of/my/icon n'existe pas dans le système de fichiers.
  • /file/path/of/my/icon n'est pas une image.
  • l'entrée utilise une syntaxe incorrecte ou des balises non valides.

Dans tous les cas ci-dessus, Ubuntu ne pourra pas répertorier correctement la fenêtre de l'application dans le lanceur.

Problème 1 - Un bug dans BAMF

Depuis Ubuntu 11.10, BAMF a un certain nombre de bugs qui empêchent une correspondance correcte des applications. Les pièges courants (temporaires) incluent:

  • Le chemin Exec étant un lien symbolique plutôt qu'un fichier normal
  • L'exécutable étant un script qui lance l'exécutable principal.

Dans ces cas, les programmeurs n'ont d'autre choix que d'utiliser une solution de contournement, telle que la suppression de l'abstraction du lien symbolique ou la liaison directe à l'exécutable. Aucune de celles-ci n'est requise par la spécification d'entrée de bureau elle-même.

23
Jjed

La fenêtre ne peut être associée à l'application que si la propriété WM_CLASS a été définie. Pour ce faire dans X11, vous utilisez:

XSetClassHint( display, window, &class_hints );

Vous devez passer un pointeur sur une structure XClassHint avec les champs 'res_name' et 'res_class'.

1
Bram