11

xrandr の呼び出し例を次に示します。

$ xrandr --output LVDS --mode 1680x1050 --pos 0x0 --rotate normal --output S-video --off --output DVI-0 --mode 1024x768 --pos 1680x104 --rotate normal

その呼び出しが成功するシステムについて考えてみてください。異なる解像度で動作する 2 つの画面 (LVDS と DVI-0) があります。DVI-0 は中央に配置された右側にあります。

Cプログラムでこのすべての情報を取得するにはどうすればよいですか? xrandr ソースコードを確認しましたが、読みにくく、--pos 値を照会する明白な方法がありません (編集: ernesopheles の回答のおかげで、わかりにくく隠されています)。

XGetWindowProperty で _NET_WORKAREA を要求できることはわかっていますが、私が見た限りでは、画面の位置はわかりません。それらすべてを含む理想的な四角形のサイズだけです。

xrandr コードの他の調査の後、このコードは解決策の一歩前進のようです。それでも確信が持てません.2940行目あたりのxrandr.cは、crtc_infoが利用できない可能性があると想定しています。解像度と位置を取得する他の方法がまだ恋しいです。

    #include <stdio.h>
    #include <X11/extensions/Xrandr.h>

    int main() {
        表示 *disp;
        XRRScreenResources *スクリーン;
        XRROutputInfo *info;
        XRRCrtcInfo *crtc_info;
        int インクレス;
        int icrtc;

        disp = XOpenDisplay(0);
        screen = XRRGetScreenResources (disp, DefaultRootWindow(disp));
        for (iscres = screen->noutput; iscres > 0; ) {
            --iscres;

            info = XRRGetOutputInfo (disp, screen, screen->outputs[iscres]);
            もし (情報 -> 接続 == RR_Connected) {
                for (icrtc = info->ncrtc; icrtc > 0;) {
                    --icrtc;

                    crtc_info = XRRGetCrtcInfo (disp, screen, screen->crtcs[icrtc]);
                    fprintf(stderr, "==> %dx%d+%dx%d\n", crtc_info->x, crtc_info->y, crtc_info->width, crtc_info->height);

                    XRRFreeCrtcInfo(crtc_info);
                }
            }
            XRRFreeOutputInfo (情報);
        }
        XRRFreeScreenResources(スクリーン);

        0 を返します。
    }

4

3 に答える 3

8

これを行うことで、各画面解像度を取得できます。

Display *dpy;
XRRScreenResources *screen;
XRRCrtcInfo *crtc_info;

dpy = XOpenDisplay(":0");
screen = XRRGetScreenResources (dpy, DefaultRootWindow(dpy));
//0 to get the first monitor   
crtc_info = XRRGetCrtcInfo (dpy, screen, screen->crtcs[0]);     

その後crtc_info->width、モニターの幅とcrtc_info->xx 位置が含まれます。

インクルードを忘れないでください:

#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>

-lX11 -lXrandr でコンパイルして、ライブラリをリンクします

于 2014-03-17T18:00:19.013 に答える
1

質問を正しく理解しているかどうかわかりません。x-server の現在の状態のパラメーターを読み取る場合は、次のコマンドを使用します。

xrandr -q
そしてその出力を解析します:

LVDS connected 1680x1050+0+0 (normal left inverted right x axis y axis) 123mm x 123mm 
[...]

最初の画面と

TV_SVIDEO connected 1024x768+1680x104 (normal left inverted right x axis y axis) 123mm x 123mm
[...]

第二に。コマンドの実行と解析は、C で記述されたプログラム内で実行できます。

于 2012-12-04T17:55:56.183 に答える