2012-12-04 16 views
9

यहाँ xrandr के लिए एक उदाहरण कॉल है:संबंधित xrandr, सी प्रोग्रामिंग

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

एक प्रणाली है जहाँ कि कॉल सफलता है के बारे में सोचो, विभिन्न संकल्पों के साथ काम कर रहे दो स्क्रीन (एलवीडीएस और डीवीआई -0) हैं। DVI-0 एक बीच में दाईं ओर स्थित है।

मैं सी प्रोग्राम में इन सभी सूचनाओं को कैसे प्राप्त कर सकता हूं? मैंने xrandr स्रोत कोड की जांच की, लेकिन मुझे इसे पढ़ने में मुश्किल हुई और --pos मूल्य से पूछताछ करने का कोई स्पष्ट तरीका नहीं है (संपादित करें: यह सादे दृष्टि में छिपा हुआ है, ernestopheles 'उत्तर के लिए धन्यवाद)।

मुझे पता है कि मैं XGetWindowProperty के साथ _NET_WORKAREA से पूछ सकता हूं, लेकिन जहां तक ​​मैंने देखा कि यह स्क्रीन की स्थिति नहीं बताता है, केवल आदर्श आयताकार का आकार जिसमें उनमें सभी शामिल हैं।

xrandr कोड के किसी अन्य अध्ययन के बाद, यह कोड समाधान के आगे एक कदम लगता है। फिर भी मुझे विश्वास नहीं है, xrandr.c लाइन 2 9 40 के आसपास मानता है कि 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
और इसके उत्पादन को पार्स:

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 
[...] 

के लिए मान लिया जाये, तो आप, एक्स-सर्वर की वर्तमान स्थिति के मापदंडों को पढ़ने के लिए निम्न आदेश का उपयोग करना चाहते दूसरा। आदेश चलाकर और पार्स करने में यह सी में लिखा एक कार्यक्रम के भीतर किया जा सकता है

+0

आपके उत्तर के लिए धन्यवाद मैंने देखा कि स्थिति मान केवल संकल्प के पास है। कम से कम मैं xrandr कोड को यह निर्धारित कर सकता हूं कि यह कैसे निर्धारित करता है। –

5

आप ऐसा करने से प्रत्येक स्क्रीन संकल्प प्राप्त कर सकते हैं: कि 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]);  

मॉनिटर और crtc_info->x की चौड़ाई में शामिल होंगे एक्स स्थिति।

न भूल जाते हैं शामिल हैं:

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

और पुस्तकालयों

संबंधित मुद्दे