5

经过一番努力,我已经为 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为一个不存在的文件,这会弹出一个回溯对话框,这表明我正在使用的图标正在成功加载(并且可能是可接受的格式)。

编辑:进一步的研究表明:

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

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

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

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

再次编辑:因为这是一个相当小众的问题,并且由于Ask Ubuntu带有许多与 Ubuntu 平台编程相关的问题,我已经在该站点上询问了一个 DBus 特定的问题。

4

1 回答 1

1

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

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

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

一个更好的解决方案是appindicator为 PHP 绑定,但这听起来更复杂,所以我暂时不考虑它。

于 2015-12-02T09:08:45.580 回答