经过一番努力,我已经编译了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
绑定,但这听起来更复杂,所以我现在就不谈了。