SSブログ

【Ubuntu 11.10:Gnome3】Gnome Shellを動かすとデスクトップの上部パネル上にメニュバーで出てしまう問題。(仮対処と考察) [ubuntu]

Ubuntu 11.10(Oneiric)上でGnome-Shellを動かした時に、透明化されたパネルを使用すると、その下にメニュバーが出てしまうという問題がありました。

【Ubuntu 11.10:Gnome3】Oneiric Alpha 3でGnome Shellを動かすと、デスクトップの上部パネルの背後にメニューバーが出てしまう問題。(Unity以外の環境なら同じ問題が発生する可能性あり)

下図のように透けて見えます。(画像をクリックすると別ウインドウで大きく見れます)

SS-gnome-shell-oneiric-001.JPG

それで、Launchpadにバグ報告をしました。下記。

https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/826771

自分でも調べてみようかな~と、一昨日あたりから調べ始めました。そしたら、同じバグの報告があってそれには対処方法が載っていました。

https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/874943

上記の対処方法を抜き出すと・・・

<< 対処方法 >>

sudo vi /etc/X11/Xsession.d/80appmenu

※エディタはお好きなのを・・・

ここで下記に書き直します。

if [ -f /usr/lib/gtk-2.0/2.10.0/menuproxies/libappmenu.so ] && [ "x$DESKTOP_SESSION" = "xubuntu" ]
then
       export UBUNTU_MENUPROXY="libappmenu.so"
fi

ブログの都合で折り返しが付いてしまってますが、全部で4行です。ifから始まる文、then、exportから始まる文、fiの4行です。

これでセーブします。

次に、また下記のコマンドで編集します。

sudo vi /etc/X11/Xsession.d/80appmenu-gtk3

下記に書き直します。

if [ -f /usr/lib/gtk-3.0/3.0.0/menuproxies/libappmenu.so ] && [ "x$DESKTOP_SESSION" = "xubuntu" ]
then
        export UBUNTU_MENUPROXY="libappmenu.so"
fi

一つ前の記述と同じ様に思えますが、gtk-3.0になっています。注意点は1つ前の記述の仕方と同じです。

またセーブして、ログアウト&ログインをすれば直ります。

下図をクリックして大きくしてみてもらうと分りますが、パネルの下のメニューバーが無くなりました。それでも、Nautilusのデスクトップ管理は効いています。

SS-gnome-shell-nautilus-001.JPG

始めにリンクを書いた以前の記事で、tista様からindicator-appmenuをアンインストールしてみたらどうですか?といわれて、実施ところ、その時は出てしまいました。恐らく、私がsudo apt-get autoremoveを実行していなかった為か、appmenu-gtkとappmenu-gtk3の両方かどちらか一方が残ってしまったのだと思います。

 

<< 原理 >>

グローバルメニューを出すのに、UBUNTU_MENUPROXYという環境変数に橋渡し役のライブラリが設定されていると、Ubuntu独自の変更が加えられているGTK-3.0のライブラリがグローバルメニューとして出そうとします。

ところが、上記のようにDESKTOP_SESSION変数がubuntuの場合のみUBUNTU_MENUPROXYを設定します。ちなみにGnome-Shellが動いている時は、DESKTOP_SESSION変数はgnome-shellとなっています。

GTK-3.0のライブラリ(GTK_MENU_BARのソースを見た限り)はこの変数がNULL(つまり設定されていない)とグローバルメニューは止めて、通常の表示(ウインドウ上に出す方法)をするようにしています。

それで、元々desktopを管理するNautilusはメニューを隠す設定になっているので出ないわけです。

 

<< 考察>>

考察というより愚痴かもしれませんが、かなり調べるのに苦労しました。

上記の方法を本対処とするかどうかは開発の方に任せますが、とにかくよく分らん状態です。

ここから記述することはUBUNTU_MENUPROXYに設定してある状態(つまり上記対処をしない)で、Gnome-Shellの下のデスクトップ上にあるメニューを消す方法についてです。

まずNautilusのデスクトップを管理するソースコードはnautilus-desktop-window.cに記述してあります。そこでは、 メニューを隠す設定をして、UBUNTU_MENUPROXYにメニューを送る設定をしています。

ところが、私がこのUBUNTU_MENUPROXYにメニューを渡す設定を取り除いてビルド&インストールしても普通に(Unityパネル上にメニューが出る)動いてしまうのです。恐らく、Nautilusの開発者は、「メニューを隠したのだからUnityパネル上に出ないはず。だから別途、メニューをUBUNTU_MENUPROXY経由で表示してもらおう」と考えたはず。

ということは、GTK-3.0はメニューを隠す設定を無視している。又は、Nautilusがどこか別の所で再表示していると言う事になります。

さらにUBUNTU_MENUPROXYにメニューを送る設定に加えて、nautilus-window.cという親クラスに相当する部分でメニューを作成していて表示しているのですが、その表示するための関数gkt_widget_showをデスクトップを管理するNautilusの場合は呼ばないようにしました。

それでも普通に動きます。わけわからん。どっか知らない所が、メニューを勝手に表示しているとしか思えません。

試しに、 デスクトップで動くNautilusのメニューをウインドウへの配置を止めてみました。そしたら、Dbusのエラーが出て、確かにGnome-shellのメニューの後ろには出なくなりましたが、Unityパネル上にもでなくなりました。

ということは、UBUNTU_MENUPROXYの先のどこかがメニューを表示している可能性があります。(色々な事を試した結果、この可能性がかなり高いと思います)

これらを整理してみると、バグは下記の可能性があります。

1) Nautilusのどこかで、デスクトップに限らずメニューを常に表示状態にしようとしている。

2) GTK-3.0がメニューを隠す設定を無視している。

3) Dbusエラーが出るとパネルの下に出ないことから、UBUNTU_MENUPROXYに設定してあるlibappmenu.soかGTK-3.0のライブラリかNautilusが、メニューの送り先(つまりUnityパネル)が無い(ハングアップや意図的に消したのも含めて)状態を誰も調べずにメニューを送りつけている。別の言い方をすると、どこかでチェックして、メニューを捨てるか、送り元に返すなどの処理をしていない。

これらのうち、複数も考えられますし、1つだけかもしれません。

ただ、私の予想では、1)の可能性は低いと思っています。それより、グローバルメニュー化に関係しているライブラリのバグのような感じがします。特に3)が原因の1つだった場合は、Nautilusだけでは対処しきれません。

こんな状態だと開発してる人も悩んでるんだろうな~

 

<< さらに愚痴 >>

これ調べてるうちに別のバグを見つけて対処してしまいました。端末からnautilus -nで起動するとGTKのクリティカルエラーが2つ出るはずです。これ、nautilus-desktop-window.cに幾つかのデスクトップ上で動作してはいけないアクション(クリックした時の動作とか)を無効にする処理をしているのですが、存在しないアクションを読み込もうとしてエラーになってます。

まだバグ報告はしていません。直っても、特に動作には影響はないです。

それと、firefoxとかecliseとかはグローバルメニュー化しませんよね。firefoxはグローバルメニュー化のパッケージを入れる必要があります。GTK-3.0のライブラリのソースを見ていたら、その理由が分りました。

GTK-3.0のソースにブラックリストとしてハードコーディングしてあった・・・私なら、別の設定ファイルに出すな~

 

 ←外付けハードディスク 2T

    2011/9/中旬から発売開始された
    比較的新しい外付けHDDです。
    筺体が白って少ないですよね。

 


nice!(1)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。