ログイン
編集不可のページディスカッション情報添付ファイル

2012-09-05 23:25:12時点のリビジョン1

メッセージを消す
clear/wm_devel/2012-09-05

MMA

画面サイズを取得する話

ウィンドウ管理を行うには画面の大きさ(画面解像度)が分からないと色々と困る1ので、これを取得する必要がある。調べてみると面倒だったのでメモ。

用語

すごく混乱しやすい。

display

screenの集合。プログラミング上は「Xサーバとの接続」的な意味もある。とにかく「ただの画面」ではない

screen
物理的なモニタ(拡張により、必ずしも1つの物理モニタとは限らない。後述)
ルートウィンドウ
Xにおけるウィンドウは階層構造を持っており、頂点に位置するのがこれ。screenに対して1つ存在する

基本的にはdisplayとscreenは1対nの関係にある。

display - screen0 - 画面
        \ screen1 - 画面
ルートウィンドウは2つ。この場合、screen間(つまりは画面間)でウィンドウを移動することはできない。

Xlibのドキュメントには、displayの説明として次のように書いてある。

A set of screens for a single user with one keyboard and one pointer (usually a mouse) is called a display.
(1.1節より)

ただし、XineramaやXRandRなどの拡張は複数のディスプレイ(上の意味ではなく普通の意味での)を1つのscreenとして扱えるようにする。現在はこちらが一般的。

display - screen0 - 画面
                  \ 画面
ルートウィンドウは1つになり、画面をまたぐようなウィンドウの移動が可能になる。

拡張について

XineramaとXRandRについて簡単にまとめる。いずれも複数のディスプレイを1つのscreenとして扱えるようにする点では同じ。XRandRの方が後発。

Xinerama

xorg.confで設定する。(静的な設定)

XRandR

こちらはxrandrコマンドを使って動的に設定を行える。

画面サイズを取得する

基本

XineramaやXRandRを考慮しない、1つの物理モニタが1つのscreenに対応している状況であれば、screenのサイズを取得するだけで良い。

   1 Display *dpy = XOpenDisplay(NULL); /* Xサーバに接続 */
   2 int screen = DefaultScreen(dpy);
   3 int width = DisplayWidth(dpy, screen);
   4 int height = DisplayHeight(dpy, screen);

DisplayWidth/HeightはScreenWidth/Heightであるべきだが、何故かこの名前になっている。これについてはXlibのドキュメントに「混乱させてごめん」と書いてある(2.2節)。仕方ない。

ややこしい場合

  1. タイル型WM作るなら特に (1)