16

システム上のすべての Xorg ディスプレイのリストと、各ディスプレイに関連付けられた画面のリストを取得する方法を知りたいです。Xlib のドキュメントを調べるのに時間を費やしましたが、必要な機能を実行する関数を見つけることができませんでした。POSIX 準拠の OS と X 以外に依存関係はないと仮定してください (たとえば、GTK はありません)。これらの最小限の依存関係を想定して私が尋ねることが不可能な場合は、他のライブラリを使用したソリューションで問題ありません。

ご助力ありがとうございます!

4

2 に答える 2

23

ディスプレイのリストを取得する唯一の方法は、/tmp/.X11-unixディレクトリを確認することです。

それができたら、Xlib を使用して各ディスプレイに詳細情報を問い合わせることができます。

例:

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <X11/Xlib.h>

int main(void) {
    DIR* d = opendir("/tmp/.X11-unix");

    if (d != NULL) {
        struct dirent *dr;
        while ((dr = readdir(d)) != NULL) {
            if (dr->d_name[0] != 'X')
                continue;

            char display_name[64] = ":";
            strcat(display_name, dr->d_name + 1);

            Display *disp = XOpenDisplay(display_name);
            if (disp != NULL) {
                int count = XScreenCount(disp);
                printf("Display %s has %d screens\n",
                    display_name, count);

                int i;
                for (i=0; i<count; i++)
                    printf(" %d: %dx%d\n",
                        i, XDisplayWidth(disp, i), XDisplayHeight(disp, i));

                XCloseDisplay(disp);
            }
        }
        closedir(d);
    }

    return 0;
}

上記を実行すると、現在のディスプレイ/画面で次の出力が得られます。

Display :0 has 1 screens
 0: 3046x1050
Display :1 has 2 screens
 0: 1366x768
 1: 1680x1050

それ以外に X ディスプレイを一覧表示するより良い方法は見つかりませんでした。より良い代替手段が存在するかどうかを知りたいです。

于 2012-07-06T18:49:54.123 に答える
4

netcoder が書いたように、問題には 2 つの異なる部分があります。

  1. X サーバーへの接続

    このプロセスは、 を使用して X サーバーへの接続を確立しますXOpenDisplay()。接続は を使用して破棄されXCloseDisplay()ます。このスレッドの netcoders コードは、それを正しく行う方法の良い例です。

    netcoder が述べたように、問題は、プロセスがどの X サーバーに接続できるかを確認する信頼できる方法がないことです。彼のコードは、X ソケットがある一般的な場所をチェックします/tmp/.X11-unix/。ユーザーが SSH (X 転送が有効になっている) などを介してリモートで接続されている場合、このアプローチはまったく機能しません。その場合、実際にはDISPLAY環境変数 (およびおそらくいくつかのトリッキーな~/.Xauthorityファイル) しかありません。

    残念ながら、私もこれ以上の方法を知りません。個人的には、ユーザーごとの構成ファイルを使用することを好みます。たとえば~/.application/displays、ユーザーは、アプリケーションがデフォルトの環境変数に加えて、環境変数と同じ形式で接続を試行する必要があるサーバー名をリストできますDISPLAY。自動ではありませんが (netcoder のコードはそうです)、このアプローチの方が私には適しています。

  2. X サーバーが提供する画面について調べる

    XScreenCount()プロセスが現在接続されている X サーバーによって提供される画面の数を返します。画面の寸法だけが必要な場合は、netcoders の例に従ってください。詳細については、 を使用してポインターXScreenOfDisplay(Display,index)を取得します。<= < .Screen0indexXScreenCount(Display)

    C コードでは、通常、マクロScreenCount()とマクロScreenOfDisplay()は実際の関数呼び出しよりも少し効率的です。

于 2012-07-06T19:15:33.437 に答える