0

アクティブなウィンドウのタイトルを変更することになっているC++(Linux、XWindow)でプログラムを書いています。具体的には、特定のテキストを追加します。

アクティブなウィンドウのウィンドウハンドルを取得して(このプログラムに関連していない場合でも)、XFetchNameおよびXStoreNameで使用することはできますか?または、特定のウィンドウのタイトルを変更する他の方法があるのでしょうか。

ありがとうございました。

アップデート1:

使用しました

     xprop -root | grep ^_NET_ACTIVE_WINDOW | cut -c41-49

正しいハンドルを返します。このアドバイスをありがとうございます。これは私が以前に使用したものです

xdpyinfo | grep focus: | cut -c16-24

実際のハンドルより1大きい数を返すように見えます。

今、新しい疑問が生じます。XStoreNameがWM_NAMEを変更しているようです。Unityデスクトップを使用していますが、代わりに_NET_WM_NAMEと表示されているようです。これも変更するにはどうすればよいですか?

更新2:答えが見つかりました

Atom Atom_name = XInternAtom(xdisplay,"_NET_WM_NAME",false);
Atom Atom_utf_type = XInternAtom(xdisplay,"UTF8_STRING",false);

XChangeProperty(xdisplay,window_handle,Atom_name,Atom_utf_type,8,PropModeReplace,(unsigned char*)new_name,strlen(new_name));

今のところうまくいくようです

4

1 に答える 1

1

外部の無関係なウィンドウでの作業に制限はありませんのでXFetchName、 とXStoreNameは機能します (つまり、WM_NAMEプロパティにアクセスしますが、それが望ましい効果をもたらすかどうかはわかりません)。

現在のウィンドウを特定したら、次のコード サンプルから始めることができます: How to know which window has focus and how to change it? 受け入れられていない答えに注意してください。_NET_ACTIVE_WINDOWルート ウィンドウのプロパティ (wm が設定したとき) は、取得できる現在のウィンドウで最も適切な値です。

_NET_WM_NAMEtype のプロパティがあることに注意してください。これは、両方が設定されている場合UTF8_STRINGに優先して、最新のウィンドウ マネージャーで使用される可能性があります。WM_NAMEすべてのアプリケーションがそれを設定するわけではありません (私の現在のデスクトップでは、firefox は設定されていますが、xterm は設定されていません)。_NET_WM_NAMEタイトルを変更する場合は、変更する準備も必要です。

もちろん、アプリケーションはいつでもタイトルをリセットすることができます。XPropertyNotifyイベントに気づき、タイトルを更新したい場合は、イベントにサブスクライブできます。同じことをする可能性のあるアプリケーションに対して、何らかの回避策があることを確認してください (つまりXPropertyNotify、タイトルの更新を取得して、必要なものにリセットします)。

于 2013-02-07T19:58:35.587 に答える