Почему некоторые открытые приложения отображаются в виде «вопросительных знаков» в панели запуска Unity?

22

У меня проблема с парой программ, которые запускаются в единстве, но после запуска создают отдельный значок. Возможно ли, чтобы пусковая установка отслеживала окна, которые она порождает, чтобы лучше организовать? Или это ошибка в самом Unity?

введите описание изображения здесь

Возможно, это не имеет значения, но эта конкретная программа является монопрограммой, а появившийся значок отображается в качестве панели.

Эндрю Редд
источник
@ j-johan-edwards: Я не уверен, на какую программу ссылаться, но это KeePass2, доступный в Центре программного обеспечения.
Эндрю Редд
В некоторых случаях вы можете решить эту проблему, установив StartupWMClassсвойство в панели
Glutanimate

Ответы:

23

Что творится

Подобные проблемы относятся к структуре сопоставления приложений Unity. Чтобы упростить технические детали, окна программы и приложения - это две разные вещи для Ubuntu. Ubuntu нужно «угадать», какому приложению принадлежит конкретное окно. И иногда это предположение не удается, и в панели запуска появляется знак вопроса.

Ошибка может быть вызвана:

  1. Ошибка в BAMF (структура соответствия приложения, упомянутая выше).
  2. Неисправное описание приложения (он же файл .desktop).
  3. Отсутствие какого-либо описания приложения вообще. Исполняемые файлы, запускающие окна, по сути не имеют этих метаданных.

Приложение, показанное в вопросе (KeePass2), страдает от проблемы типа 1, о которой было сообщено соответствующему средству отслеживания ошибок .

Примеры проблем

Приведенные ниже примеры являются техническими и предназначены для программистов, которые хотят, чтобы их собственные приложения правильно отображались в средстве запуска Ubuntu.

Проблема 3 - Нет описания приложения

Чтобы приложение могло интегрироваться с Unity, то есть иметь возможность поиска в Dash и располагаться в модуле запуска, оно должно иметь запись на рабочем столе. Такие данные помещаются в /usr/share/applications/, /usr/local/share/applications/и $HOME/.local/share/applications/(причем два последних для третьих программного обеспечения сторонних производителей , общесистемные и пользователь только соответственно). Они заканчиваются .desktopрасширением и следуют этому базовому формату:

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

Эта запись запускает программу, вызывая Execисполняемый файл. Всякий раз, когда эта программа отображает окно или диалоговое окно, Unity замечает, что ее исполняемый файл «принадлежит» этому описанию приложения, и использует данное Nameи Iconв модуле запуска.

Это простой пример. Формальная спецификация охватывает множество дополнительных функций.

Проблема 2 - Неправильное описание приложения

Предположим, что my_app.desktopсуществует в допустимом каталоге приложения, но:

  • /file/path/of/my/icon не существует в файловой системе.
  • /file/path/of/my/icon это не изображение.
  • запись использует неправильный синтаксис или недействительные теги.

В любом из вышеперечисленных случаев Ubuntu не сможет правильно отобразить окно приложения в панели запуска.

Проблема 1 - ошибка в BAMF

Начиная с Ubuntu 11.10, BAMF имеет ряд ошибок, которые мешают правильному сопоставлению приложений. Общие (временные) подводные камни включают в себя:

  • ExecПуть будучи символическую ссылку , а не обычный файл
  • Исполняемый файл представляет собой скрипт, который запускает основной исполняемый файл.

В этих случаях у программистов нет другого выбора, кроме как использовать обходной путь, такой как удаление абстракции символической ссылки или прямая ссылка на исполняемый файл. Ни один из них не требуется самой спецификацией записи рабочего стола.

Jjed
источник
Еще кое-что. Вы можете иметь .desktopфайлы для одного и того же приложения как в, так ~/.local/share/applications/и в /usr/share/applications/. Первый файл переопределяет второй, даже если в нем не указан значок.
1

Окно может быть сопоставлено только с приложением, если свойство WM_CLASS было установлено. Для этого в X11 вы используете:

XSetClassHint( display, window, &class_hints );

Вам нужно передать указатель на структуру XClassHint с полями 'res_name' и 'res_class'.

Брэм
источник
-1

У меня было несколько проблем с 16.04, включая неактивные значки, и иногда тачпад становился ошибочным (Acer V15 nitro), а центр программного обеспечения (возможно, и другие значки) не открывался из значка (только из команды терминала). Я нашел рекомендацию где-нибудь удалить и переустановить программное обеспечение GNOME. С тех пор, как я это сделал, вся система стала на 100% стабильной, больше не выделяет серые значки и работает отлично. Поначалу это выглядело страшно, когда я перезагрузился после этого изменения - много системных сообщений при перезагрузке - так что делайте это на свой страх и риск.

sudo apt-get autoremove gnome-software && sudo apt-get install gnome-software
Стив
источник
2
Это совершенно не связано с вопросом.
Мартин Торнтон