После некоторой борьбы я скомпилировал модуль PHP для wxPHP и пишу несколько скриптов, чтобы посмотреть, что он может сделать. Моя первая демонстрация создает окно и значок на панели задач, и я не могу заставить последний работать.
Я использую это на Ubuntu 14.04 LTS.
Вот скрипт, который я использую:
<?php
// Create an icon (does not appear on Ubuntu 14.04 LTS)
$icon = new wxTaskBarIcon();
echo "Task bar available: " .
(wxTaskBarIcon::IsAvailable() ? 'Yes' : 'No') . "\n";
echo "Create task bar icon: " . ($icon ? 'OK' : 'Failed') . "\n";
$wxIcon = new wxIcon('icon.ico');
$ok = $icon->setIcon($wxIcon);
echo "Set image for icon: " . ($ok ? 'OK' : 'Failed') . "\n";
// Create a window (works fine)
$main = new wxFrame(null, wxID_TOP, "Title" );
$main->Show();
wxEntry();
Теперь я представляю, что «панель задач» в Unity — это верхняя панель с часами, звуком и сетевыми элементами управления, а не панель приложения с левой стороны. Я получаю пустой серый значок приложения в доке, когда выполняется задача PHP, но это значок статуса вверху, за которым я следую.
Выводы консоли из приведенного выше сценария показывают, что все в порядке:
Task bar available: Yes
Create task bar icon: OK
Set image for icon: OK
Я пытался изменить icon.ico
в несуществующий файл, и появляется всплывающее диалоговое окно обратной трассировки, которое показывает, что используемый мной значок успешно загружается (и предположительно в приемлемом формате).
Изменить: дальнейшие исследования показывают, что:
gsettings
ключи, на которые есть ссылки, не найдены в моей более поздней версии Ubuntu)Таким образом, в настоящее время я предполагаю, что мой код работал бы, если бы не Unity, препятствующий операции, — и что он немедленно работал бы в других дистрибутивах, таких как Mint.
Я нашел это руководство это объясняет, как сделать белый список в Ubuntu 14, но это крайне неудовлетворительно; чтобы сделать что-то настолько тривиальное, не нужно изменять список доверенных репо. Если я захочу распространить приложение, написанное на wxPHP, пользователи сочтут (и должны) это неприемлемым.
Есть несколько направлений исследований, которые я сейчас ищу:
Отредактируйте еще раз: так как это довольно нишевый вопрос, и так как Спросите Ubuntu я задал ряд вопросов, связанных с программированием для платформы Ubuntu, я спросил специфичный для DBus вопрос на этом сайте.
В целом, невозможно создать значок панели задач в Ubuntu, по крайней мере, с помощью wxPHP или wxWidgets. Это обдуманное проектное решение от команды юзабилити Ubuntu для обеспечения согласованности и доступности в использовании значков состояния уровня приложения.
Я поднял это как ошибка и получил много очень полезной информации от сопровождающего wxPHP. Я согласен с ним в том, что эта функция была бы лучше в восходящем потоке в wxWidgets, но, судя по комментариям в Интернете, не было особого желания добавить ее туда.
Мое краткосрочное решение будет состоять в том, чтобы настроить процесс Python для использования его собственного индикатора приложения (python-appindicator
в репозитории Ubuntu) и обмениваться данными между двумя процессами (PHP на Python для изменения значка, Python на PHP для отправки событий выбора меню). Я ожидаю начать с того, что я буду использовать wxFileSystemWatcher
как простая система связи, так как она хорошо работает в цикле событий wxWidgets.
Лучшее решение было бы иметь appindicator
привязки для PHP, но это звучит более сложным, поэтому я оставлю это пока.
Других решений пока нет …