スポンサーリンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« ウインドウの列挙に苦労する | トップページ | ダイアログを作成中 »

原因はアトムにあった

今は、Mirror-DTC for Ubuntu Ver1.4.1の開発中で、今回の開発では、Windows版に続いてトランスポーターを追加する予定なので、デスクトップにあるウインドウの列挙機能を実装してみていたのだが、やっと、何とかなったので、ダイアログの実装に入った。

昨日書いたように、ウインドウの列挙自体は、XWindow用の処理関数である所のXQueryTree関数を使って普通に行えたのだが、列挙されるウインドウが多すぎた。

このため、それらの中から、普通にデスクトップ上に見えているウインドウだけを残す処理を追加する必要があったのだが、とりあえず、昨日の時点で、それっぽいウインドウだけを残し、そのタイトルを取り出す所までは行える様になっていた。

しかし、昨日の時点では、最小化されていて、実際にはデスクトップ上には見えていないウインドウも、最小化されていないウインドウと同じ扱いになっていた。

これは、ウインドウから、最小化されている、という情報を取り出す事が出来なかったからなのだが、ネットを検索していると、最小化されているウインドウは、_NET_WM_STATE_HIDDENというプロパティを持っている、という情報は得られていた。

そして、ウインドウのプロパティというのは、XGetWindowPropertyという関数で得られる事も判っていた。具体的には、昨日の時点で、以下の様な書込みを見つけていたので、プロパティは取り出せていたのだが、その中に、_NET_WM_STATE_HIDDENというモノが存在しているかどうかが判らなかった訳だ。

[SOLVED] How to read the state by using _NET_WM_STATE in xlib

上記にあるコードの間違いを修正すれば、指定ウインドウのプロパティを列挙可能になるのだが、それらのプロパティは数値でしかないので、作者的には、それらのどれが_NET_WM_STATE_HIDDENに相当するのか、が、判らなかった訳だ。

普通、コードの中に、_NET_WM_STATE_HIDDENなんて文字列があった場合、ヘッダーで、その値が定義されている。

なので、上記で出力されるプロパティの中に_NET_WM_STATE_HIDDENに相当する数値があっても可笑しくなかったし、実際に、最小化した状態と最小化しない状態でプロパティを出力させてみると、出力されるプロパティは異なったので、多分、その異なったプロパティが_NET_WM_STATE_HIDDENに相当するプロパティであろう事は想像できた。

しかし、いくらネットを検索してみても、_NET_WM_STATE_HIDDENの値が定義されているヘッダーに関する情報は出てこなかった訳だ。

もっとも、以下の様なページはヒットした。

Xlib: How to check if a window is minimized or not?

上記のページでは、_NET_WM_STATE_HIDDENという文字列が出て来ているのだが、その前には、「vdl_x11_usefull_atoms->」というのが付いていて、作者環境でビルドするとエラーが出たし、ネットで検索してみても、vdl_x11_usefull_atomsなんてオブジェクトは、このページ以外では出てこなかった。

と、言うことで、ウインドウの最小化状態と、前述の_NET_WM_STATE_HIDDENが関係している事は、多分、間違いない筈だったのだが、決定的な情報が取得できなかったので、作者的には、どうしようもない状況になっていた訳だ。

もっとも、更に色々と調べていると、「xprop」というプログラムを使えば、ウインドウのプロパティを表示できる事が判ったので、使ってみると、_NET_WM_STATE_xxxの表示も行われた。

なので、このプログラムについても、ソースコードをダウンロードしてきて中身を見てみたのだが、コードの中には、_NET_WM_STATE_xxxの文字列は存在しなかった。

このため、少し真面目に調べてみたのだが、その結果としては、この文字列はXのサーバーが保持している感じで、このプログラムでは、この文字列を表示するために、結構、複雑な処理を行っている事が判った。

と、言うことで、作者的には、Windows環境でなら、簡単に取得できるウインドウの最小化状態の取得に、ここまで複雑な処理コードが必要になるなんて、Xウインドウの設計者は変人だったのか? と、思ったのだが、xpropみたいなコードは使えないなあ、と、思って、更にネットを検索してみていると、以下のページを見つけた訳だ。

Xウインドウのプロパティに関連するページ

で、上記で作者が注目したのは785行目から始まるwindowManagerStateDescriptionという関数だ。

具体的には、前述のxpropでは、ウインドウのプロパティ値から、_NET_STATE_HIDDENの様な文字列を抽出するのに、かなりのコード量を費やしていたのに対し、上記のプログラムでは、逆に、その文字列からプロパティ値を作成し、出力されるプロパティ値と比較する事で、すっきりと、作者がやりたいのと同様の処理を行っていた訳だ。

つまり、Xウインドウのプロパティというのは、Atomという形式で表現されるので、Windowsなんかのプロパティがビットフィールドや素直な値で表現されるのに対し、扱いづらいのだが、自分で同一のAtomを作成するのは簡単なので、そうやって作成したAtomと比較するのなら、出来ない話しでもない、という事が判った訳だ。

と、言うことで、作者的にも、やっと、ウインドウが最小化されているかどうかの判定が可能になったのだが、最終的なコード量は大した事はないので、どこかに普通に動作するサンプルコードがあったら、こんなにコーディングに時間をとられる事は無かった筈だ。

ちなみに、作者的には、何故、Atomなんて面倒なモノが導入されたのかが不思議だったので、ネットで調べてみた所、以下のWikiが見つかった。

X Window System コアプロトコル

で、上記のよると、

アトム(Atom)とは、文字列を表す32ビット整数である。文字列が任意の長さであるのに対してアトムは常に32ビット整数であり、プロトコル設計者は文字列を短い固定サイズで表すためにアトムを導入した

とあった。

で、プロパティについては、以下の様な記述がある。

各ウィンドウには、事前定義された属性群とプロパティ群があり、サーバに全て格納され、クライアントからは適当な要求でアクセスできる。属性はウィンドウに関するデータであり、サイズ、位置、背景色などがある。プロパティはウィンドウにアタッチされた任意のデータである。属性とは対照的に、プロパティはXコアプロトコルのレベルでは何の意味もない。クライアントはウィンドウのプロパティとして任意のデータを格納できる。

なので、上記を総合すると、ウインドウのプロパティというのは、任意のデータを格納できるので、予め、値を決定しておく様なモノではなかったので、X関連の各種ヘッダーに値は定義されていない、という事になる。

そして、プロパティは、その意味が解りやすい様に文字列で表現されるのだが、文字列のままだと、データサイズが大きくなりすぎるので、ハッシュ値等を使って32ビット値のAtomという形にして扱う事にした、みたいな感じになる様だ。

と、言うことで、その経緯まで調べれば、納得できない話でもない感じではあるのだが、ウインドウが最小化されているかだとか、最大化されているかだとか、フォーカスを持っているか、みたいな、Windows環境でなら、当たり前に取得できる情報が、Xウインドウ環境では、簡単には取得できない、というのは、不便である事には変わりないかもしれない。

まあ、Xウインドウの初版は1984年に開発され、今現在のWindowsの原型である所のWin32APIが実装されたWindows95のリリースは1995年なので、Xウインドウが可笑しな事をやっているのも、Windows95よりも10年以上前のハードウェア環境で動作させる必要があったからなのかもしれない、と、考えると、致し方ないのかもしれないのだが。

« ウインドウの列挙に苦労する | トップページ | ダイアログを作成中 »

2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google