如何在 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
更改为一个不存在的文件,这会弹出一个回溯对话框,显示我正在使用的图标正在成功加载(并且可能是可接受的格式)。
编辑:进一步研究表明:
- 较早版本的 Ubuntu 阻止应用程序使用 taskbar unless specifically whitelisted(请注意,此处引用的
gsettings
键在我的 Ubuntu 较新版本中找不到)
- 更高版本需要 something called AppIndicators
因此,我目前的猜测是,如果不是 Unity 阻止该操作,我的代码将可以运行 - 并且它会立即在其他发行版(例如 Mint)中运行。
我确实发现 this guide 解释了如何在 Ubuntu 14 上加入白名单,但这是最令人不满意的;做一些如此微不足道的事情不需要改变受信任的回购列表。如果我希望分发一个用 wxPHP 编写的应用程序,用户会(并且应该)认为这是不可接受的。
有几个研究途径,我现在正在寻求建议:
- 在 wxPHP 中做一些不同的事情,以防它(或上游 wxWidgets)有 AppIndicators 支持(我猜它没有)
- 检测 AppIndicators 是否为 运行,如果它使用 PHP 发送 DBus 消息来构建图标(虽然我已经为 AppIndicators 寻找 DBus 消息规范但没有成功)
再次编辑:因为这是一个相当小众的问题,而且由于 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
绑定,但这听起来更复杂,所以我暂时保留它。
经过一番努力,我为 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
更改为一个不存在的文件,这会弹出一个回溯对话框,显示我正在使用的图标正在成功加载(并且可能是可接受的格式)。
编辑:进一步研究表明:
- 较早版本的 Ubuntu 阻止应用程序使用 taskbar unless specifically whitelisted(请注意,此处引用的
gsettings
键在我的 Ubuntu 较新版本中找不到) - 更高版本需要 something called AppIndicators
因此,我目前的猜测是,如果不是 Unity 阻止该操作,我的代码将可以运行 - 并且它会立即在其他发行版(例如 Mint)中运行。
我确实发现 this guide 解释了如何在 Ubuntu 14 上加入白名单,但这是最令人不满意的;做一些如此微不足道的事情不需要改变受信任的回购列表。如果我希望分发一个用 wxPHP 编写的应用程序,用户会(并且应该)认为这是不可接受的。
有几个研究途径,我现在正在寻求建议:
- 在 wxPHP 中做一些不同的事情,以防它(或上游 wxWidgets)有 AppIndicators 支持(我猜它没有)
- 检测 AppIndicators 是否为 运行,如果它使用 PHP 发送 DBus 消息来构建图标(虽然我已经为 AppIndicators 寻找 DBus 消息规范但没有成功)
再次编辑:因为这是一个相当小众的问题,而且由于 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
绑定,但这听起来更复杂,所以我暂时保留它。