经过一番努力,我已经为 wxPHP 编译了 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 上加入白名单的指南,但这是最不令人满意的;做一件如此微不足道的事情不需要改变受信任的回购列表。如果我希望分发一个用 wxPHP 编写的应用程序,用户会(并且应该)发现这是不可接受的。
有几种研究途径,我现在正在寻求建议:
- 在 wxPHP 中做一些不同的事情,以防它(或上游 wxWidgets)支持 AppIndicators(我猜它不支持)
- 检测 AppIndicators 是否正在运行,以及是否使用 PHP 发送 DBus 消息来构建图标(尽管我徒劳地寻找 AppIndicators 的 DBus 消息规范)
再次编辑:因为这是一个相当小众的问题,并且由于Ask Ubuntu带有许多与 Ubuntu 平台编程相关的问题,我已经在该站点上询问了一个 DBus 特定的问题。