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


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

经过一番努力,我已经编译了wxHP的PHP模块,并正在编写一些脚本来看看它能做什么。我的第一个演示创建了一个窗口和一个任务栏图标,但我无法让后者工作。

我在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任务运行时,我确实在dock中得到了一个空白的灰色应用程序图标,但它是我想要的顶部的状态图标。

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

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

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

编辑:进一步研究表明:

  • 早期版本的Ubuntu阻止应用程序使用任务栏,除非被特别列入白名单(请注意,此处引用的gsettings密钥在我的更新版本的Ubuntu中找不到)
  • 更高版本需要一种名为AppIndicators的东西

因此,我目前的猜测是,如果不是Unity阻止了操作,我的代码会起作用,而且它会立即在Mint等其他发行版中运行。

我确实找到了这个指南,解释了如何在Ubuntu 14上列入白名单,但这是最令人不满意的;要做一些琐碎的事情,不需要更改可信回购列表。如果我希望分发用wxHP编写的应用程序,用户会(而且应该)认为这是不可接受的。

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

  • 在wxHP中做一些不同的事情,以防它(或上游wxWidgets)支持AppIndicators(我猜它没有)
  • 检测AppIndicators是否正在运行,以及是否使用PHP来构造图标来发送DBus消息(尽管我徒劳地为AppIndicator寻找了DBus消息规范)

再次编辑:由于这是一个相当小众的问题,并且Ask Ubuntu包含了许多与Ubuntu平台编程相关的问题,我在该网站上问了一个DBus特定的问题。

从广义上讲,在Ubuntu上创建任务栏图标是不可能的,至少通过wxHP或wxWidgets是这样。这是Ubuntu可用性团队的一个深思熟虑的设计决定,旨在将一致性和可访问性引入应用程序级状态图标的使用中。

我将此作为一个bug提出,并从wxHP的维护人员那里获得了许多非常有用的信息。我同意他的观点,即这个功能在wxWidgets的上游会更好,但从网上的评论来看,似乎没有太多兴趣在那里添加它。

我的短期解决方案是建立一个Python进程,使用它自己的应用程序指示符(Ubuntu repo中的python-appindicator),并在两个进程之间进行通信(PHP到Python更改图标,Python到PHP发送菜单选择事件)。我希望首先使用wxFileSystemWatcher作为一个简单的通信系统,因为它在wxWidgets事件循环中运行良好。

一个更好的解决方案是为PHP提供appindicator绑定,但这听起来更复杂,所以我现在就不谈了。