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タスクが実行されているときに、ドックに空白の灰色のアプリアイコンが表示されますが、それは私が求めている上部のステータスアイコンです。

上記のスクリプトからのコンソール出力は、すべてが正常であることを示しています。

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

を存在しないファイルに変更しようとしましたicon.icoが、これによりバックトレース ダイアログが表示され、使用しているアイコンが正常に読み込まれていることが示されます (そして、おそらく許容される形式です)。

編集:さらなる研究は次のことを示しています:

したがって、現時点では、Unity が操作を妨げていなければ私のコードは機能し、Mint などの他のディストリビューションでもすぐに機能すると思います。

Ubuntu 14でホワイトリストに登録する方法を説明するこのガイドを見つけましたが、これは最も満足のいくものではありません。些細なことをするために、信頼できるレポリストを変更する必要はありません。私が wxPHP で書かれたアプリケーションを配布したい場合、ユーザーはこれを受け入れられないと思うでしょう (またすべきです)。

調査にはいくつかの方法があり、現在アドバイスを求めています。

  • wxPHP (または上流の wxWidgets) が AppIndicators をサポートしている場合に備えて、wxPHP で別のことを行います (私の推測では、サポートされていません)。
  • AppIndicators が実行されているかどうかを検出し、実行されている場合は、PHP を使用して DBus メッセージを送信し、アイコンを作成します (AppIndicators の DBus メッセージ仕様を無駄に探しましたが)。

もう一度編集します。これはかなりニッチな質問であり、Ask Ubuntuには Ubuntu プラットフォームのプログラミング関連の質問が多数掲載されているため、そのサイトでDBus 固有の質問をしました。

4

1 に答える 1

1

概して、少なくとも wxPHP または wxWidgets を介して、Ubuntu でタスクバー アイコンを作成することはできません。これは、アプリケーション レベルのステータス アイコンの使用に一貫性とアクセシビリティを導入するための Ubuntu ユーザビリティ チームによる意図的な設計上の決定です。

私はこれをバグとして提起し、wxPHP のメンテナーから多くの非常に有用な情報を入手しました。この機能は wxWidgets のアップストリームの方が優れているという彼の意見に同意しますが、オンラインのコメントから、そこに追加する意欲はないようです。

私の短期的な解決策は、独自のアプリ インジケーター ( python-appindicatorUbuntu リポジトリ内) を使用するように Python プロセスをセットアップし、2 つのプロセス間で通信することです (アイコンを変更するために PHP から Python へ、メニュー選択イベントを送信するために Python から PHP へ)。wxFileSystemWatcherこれは wxWidgets イベント ループ内でうまく機能するため、単純な通信システムとして使用することから始めることを期待しています。

より良い解決策はappindicator、PHP 用のバインディングを用意することですが、それはより複雑に聞こえるので、今はそのままにしておきます。

于 2015-12-02T09:08:45.580 に答える