如何在 Ubuntu/Unity 中使用 wxPHP 创建任务栏图标?

How to create a task bar icon with wxPHP in Ubuntu/Unity?

经过一番努力,我为 wxPHP 编译了 PHP 模块,并且正在编写一些脚本以查看它能做什么。我的第一个演示创建了一个 window 和一个任务栏图标,但我无法使后者工作。

我是 运行 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 中的 "task bar" 是顶部的时钟、声音和网络控件栏,而不是左侧的应用停靠栏。当 PHP 任务是 运行 时,我确实在 Dock 中看到一个空白的灰色应用程序图标,但它是我想要的顶部的状态图标。

上述脚本的控制台输出显示一切正常:

Task bar available: Yes
Create task bar icon: OK
Set image for icon: OK

我尝试将 icon.ico 更改为一个不存在的文件,这会弹出一个回溯对话框,显示我正在使用的图标正在成功加载(并且可能是可接受的格式)。

编辑:进一步研究表明:

因此,我目前的猜测是,如果不是 Unity 阻止该操作,我的代码将可以运行 - 并且它会立即在其他发行版(例如 Mint)中运行。

我确实发现 this guide 解释了如何在 Ubuntu 14 上加入白名单,但这是最令人不满意的;做一些如此微不足道的事情不需要改变受信任的回购列表。如果我希望分发一个用 wxPHP 编写的应用程序,用户会(并且应该)认为这是不可接受的。

有几个研究途径,我现在正在寻求建议:

再次编辑:因为这是一个相当小众的问题,而且由于 Ask Ubuntu 包含许多针对 Ubuntu 平台的编程相关问题,我已经在该网站上询问 a DBus-specific question

一般来说,不可能在 Ubuntu 上创建任务栏图标,至少通过 wxPHP 或 wxWidgets 是不可能的。这是来自 Ubuntu 可用性团队的 deliberate design decision,旨在将一致性和可访问性引入到应用程序级状态图标的使用中。

我提出了这个as a bug并从wxPHP的维护者那里获得了很多非常有用的信息。我同意他的看法,这个功能在wxWidgets的上游会更好,但是从网上的评论来看,似乎没有多少人愿意把它加在那里。

我的短期解决方案是设置一个 Python 进程以使用其自己的 App Indicator(Ubuntu 存储库中的 python-appindicator)并在两个进程之间进行通信( PHP 到 Python 更改图标,Python 到 PHP 发送菜单选择事件)。我希望首先使用 wxFileSystemWatcher 作为一个简单的通信系统,因为它在 wxWidgets 事件循环中运行良好。

更好的解决方案是为 PHP 设置 appindicator 绑定,但这听起来更复杂,所以我暂时保留它。