2012-12-04 16 views
9

は、ここでのxrandrする例呼び出しです:のxrandrは、Cプログラミング

 
$ 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の1つが真ん中に置かれています。

この情報をCプログラムでどのように取得できますか? xrandrソースコードを確認しましたが、読みにくく、--pos値を照会する明白な方法がありません(編集:それは素人の感謝の気持ちで、隠されています)。

私はXGetWindowPropertyを使って_NET_WORKAREAに尋ねることができますが、私が見た限りでは、スクリーンの位置は教えてくれません。それらのすべてを含む理想的な矩形のサイズです。

xrandrコードの他の調査の後、このコードは解決策を進めるようです。 しかし、私は確信していません、行2940のxrandr.cは、crtc_infoが利用できないと仮定しています。私はまだ解決策と位置を得るために他の方法を欠場する。

 

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

    int main() { 
     Display *disp; 
     XRRScreenResources *screen; 
     XRROutputInfo *info; 
     XRRCrtcInfo *crtc_info; 
     int iscres; 
     int icrtc; 

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

      info = XRRGetOutputInfo (disp, screen, screen->outputs[iscres]); 
      if (info->connection == 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 (info); 
     } 
     XRRFreeScreenResources(screen); 

     return 0; 
    } 

+0

こんにちは、私は思っていたライブラリをリンクする-lX11 -lXrandrでコンパイルしますか?または、より良い方法を見つけたら? – yatg

+0

私はxrandrが利用できない場合にこれとxinermaの組み合わせを使用すると考えました:http://stackoverflow.com/a/836376/5062337 – yatg

答えて

1

私は質問を正しく理解するかどうかはわかりません。

xrandr -q
とその出力を解析:あなたは、Xサーバの現在の状態のパラメータを読み出し、次のコマンドを使用したい、と仮定すると、

最初の画面のための
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で書かれたプログラム内で行うことができますパース

あなたは、このことによって、各画面の解像度を得ることができます
+0

私はあなたの答えに感謝しました。少なくとも私はそれがどのようにそれを決定するかについてxrandrコードを調べることができます。 –

5

:モニターとcrtc_info->xの幅が含まれていますそのcrtc_info->width

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]);  

をxの位置。

は、忘れてはいけない:

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

をし、あなたのコード今日は確信している場合があり