C 检索物理屏幕大小
Xorg启动并创建一个虚拟屏幕 虚拟屏幕大小确定为3120 x 1050 我想是用xinerama跨越1680x1050和1440x900两个物理屏幕 没有配置文件,我不想更改系统设置 我的应用程序使用DisplayWidth和DisplayHeight来检索屏幕大小,这在单屏幕设置中很好C 检索物理屏幕大小,c,xlib,C,Xlib,Xorg启动并创建一个虚拟屏幕 虚拟屏幕大小确定为3120 x 1050 我想是用xinerama跨越1680x1050和1440x900两个物理屏幕 没有配置文件,我不想更改系统设置 我的应用程序使用DisplayWidth和DisplayHeight来检索屏幕大小,这在单屏幕设置中很好 maxwidth = DisplayWidth (dpy, scrnum); maxheight = DisplayHeight (dpy, scrnum); 但是在自动创建虚拟屏幕的双屏幕设置中,这些函数
maxwidth = DisplayWidth (dpy, scrnum);
maxheight = DisplayHeight (dpy, scrnum);
但是在自动创建虚拟屏幕的双屏幕设置中,这些函数返回虚拟屏幕的大小
我尝试了不同的方法来检索物理屏幕大小,结果相同:
maxwidth = XWidthOfScreen (XScreenOfDisplay(dpy, scrnum));
maxheight = XHeightOfScreen (XScreenOfDisplay(dpy, scrnum));
或
是否可以仅使用Xlib检索物理屏幕的大小?我希望避免仅仅为了设置窗口的大小而添加更多库依赖项,但这可能是使用Xrand扩展可以实现的吗?我知道的唯一方法是使用您提到的Xrandr扩展。您将需要使用XRGetScreenResources并通过每个Crtc循环以获得所需的信息
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include <stdio.h>
int main()
{
Display *display = XOpenDisplay(NULL);
XRRScreenResources *screens = XRRGetScreenResources(display, DefaultRootWindow(display));
XRRCrtcInfo *info = NULL;
int i = 0;
for (i = 0; i < screens->ncrtc; i++) {
info = XRRGetCrtcInfo(display, screens, screens->crtcs[i]);
printf("%dx%d\n", info->width, info->height);
XRRFreeCrtcInfo(info);
}
XRRFreeScreenResources(screens);
return 0;
}
#包括
#包括
#包括
int main()
{
Display*Display=XOpenDisplay(空);
XRRScreenResources*screens=XRRGetScreenResources(显示,DefaultRootWindow(显示));
XRRCrtcInfo*info=NULL;
int i=0;
对于(i=0;incrtc;i++){
info=XRRGetCrtcInfo(显示、屏幕、屏幕->crtcs[i]);
printf(“%dx%d\n”,信息->宽度,信息->高度);
XRRFreeCrtcInfo(信息);
}
XRR自由屏幕资源(屏幕);
返回0;
}
这是一个良好的开端,但稳健的解决方案要复杂一些。请参阅:。
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include <stdio.h>
int main()
{
Display *display = XOpenDisplay(NULL);
XRRScreenResources *screens = XRRGetScreenResources(display, DefaultRootWindow(display));
XRRCrtcInfo *info = NULL;
int i = 0;
for (i = 0; i < screens->ncrtc; i++) {
info = XRRGetCrtcInfo(display, screens, screens->crtcs[i]);
printf("%dx%d\n", info->width, info->height);
XRRFreeCrtcInfo(info);
}
XRRFreeScreenResources(screens);
return 0;
}