web-dev-qa-db-ja.com

mutter、gdk、wnck、またはgtkを使用してgnome-Shellのウィンドウタイトルを非表示にする

私は次の方法を試しています:

  1. gdkまたはGtkウィンドウとして、現在開いているすべてのアプリケーションウィンドウのリストを取得します
  2. 選択したウィンドウのウィンドウ装飾を削除します(私の場合は最大化されています)。

Mutter、gdk、wnck、またはgtk(またはGdkX11など)を使用してこれを実行したいと思います(つまり、gobjectのイントロスペクションを備えたもの)。

私は次の質問を見ました: 最大化された端末ウィンドウからタイトルバーを削除する しかし、それを機能するものに変換するのに苦労しています。

(私が使用している言語はjavascriptですが、これはすべてgobjectイントロスペクションを使用しているため、これはやや無関係です)。

私は現在GNOME 3.2を使用しています(ただし、GNOME 3.4ソリューションを公開しています)。


1。に関しては、wnckmutterを使用してすべてのウィンドウをかなり簡単に取得できます(たとえば、Wnck.Screen.get_default().get_windows())が、これらをG(tまたはd?)kに変換するにはどうすればよいですか装飾を削除するためのウィンドウ?

つぶやきウィンドウを次のようなGdkに変換できます。

xwin = GdkX11.X11Window.foreign_new_for_display( 
                          Gdk.Display.get_default(), 
                          mutterWindow.get_compositor_private()['x-window'] );

ただし、、このxwinオブジェクトはxwin.unmaximize()xwin.maximize()などのコマンドに応答しないため、変換で何かがうまくいかなかったように感じます!

ウィンドウをGdkまたはGtkに変換する理由は、Gdkの set_decorations またはGtkの set_hide_titlebar_when_maximized を使用できるようにするためです。

Gdk.Screen.get_default().get_toplevel_windows()Gtk.Window.list_toplevels()を見てきましたが、これらは私が開いているウィンドウよりも多くのウィンドウのリストを返します。実際のアプリケーションウィンドウがリストにあるかどうかと、それらを一致させる方法はわかりません。


2。に関しては、最初にGdk内からアクティブウィンドウを取得した場合(Gdkウィンドウであることがわかっており、unmaximizemaximizeなどのイベントに適切に応答するため、foreign_new_for_displayを使用する場合とは異なります)以前にリンクされた質問に従って装飾を削除しようとすると、ウィンドウ(&プロセス)が死にます!エラーが何なのかわかりません。

const Gdk = imports.gi.Gdk;

// get current window. It's a terminal, not null.
// For now assume it's maximized.
curwin = Gdk.Screen.get_default().get_active_window();
// decorations don't seem to updated unless I unmaximize & re-maximize
curwin.unmaximize();
// try remove decorations: window + process dies!
curwin.set_decorations(0);
curwin.maximize();

curwin.set_decorations(Gdk.WMDecoration.BORDER)(注:GDKウィンドウのドキュメント ここ )を使用すると、ウィンドウが最大化されていない場合(タイトルバーがなくなった場合)に希望どおりにウィンドウが表示されますが、最大化された場合はタイトルバー用のスペーステキストは表示されませんが、まだ残っています。


誰かが私の目標のどちらを達成するかについての洞察を与えることができますか? (最終的に、UbuntuのUnityネットブックリミックスのmaximusのような、最大化されたウィンドウのタイトルバーの非表示の自動マジック)。 compizやmetacityウィンドウテーマのXMLを変更するなどの外部アプリとは対照的に、GobjectイントロスペクションでGtk/Gdk/wnck/mutter/anythingを使用してこれを本当に使用したいと思います(これを達成するためにできることはわかっています)。

4

Gnome-Shell開発者と少し議論した後、これは解決されました。

1.で実行しようとした変換はオプションではありませんでした-そのようなことは機能しません。

2.のバージョンは正しいコードでしたが、outsidegnome-Shell拡張から実行する場合にのみ機能します(つまり、gjsを使用してjavascriptファイルを実行します)見かけのガラスや拡張機能からではなくバイナリ)。 gnome-Shell/mutterプロセス内からのようなウィンドウ装飾をいじるとクラッシュすることが判明しました。

したがって、コードがoutside拡張から実行されている限り、問題を解決できます。オプション2でスクリプトを実行するための外部プロセスの起動は機能しました(ただし、xpropを生成し、_Xで識別される_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED atomをtrueに設定する方が簡単でした)ウィンドウアクターのXIDを持つウィンドウのchildであるID。

(誰かが興味を持っている場合、最終結果は Maximus gnome Shell extension

3