显示接口测试
创始人
2024-05-27 17:34:46
0

背景需求

两个显示器连接到一台PC,期望每台显示器可以单独显示,在一台显示器显示时,另外一台显示器同PC的连接断开,即系统下查看到连接状态为disconnected。

同时在显示器上图形化显示当前显示器编号。如下图,期望当显示器A连接到PC时,显示器内容显示为:显示器A;对B同理。

显示控制

问题

当从显示器A切换到显示B时,桌面上的图标不可见。

分析

1) 首先查看 当前屏幕设置,已经改成为单屏显示。并非扩展屏幕显示导致的。

2) xranr --verbose

通过命令输出可以看到当前screen大小为 3840*1080

xrandr --verbose 
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 16384 x 16384

而此时查询到的当前的分辨率仅仅为1920*1080

DP-1 connected 1920x1080+1920+0 (0x47) normal (normal left inverted right x axis y axis) 477mm x 268mmIdentifier: 0x43Timestamp:  545969Subpixel:   unknownGamma:      1.0:1.0:1.0Brightness: 1.0Clones:    CRTC:       2CRTCs:      0 1 2Transform:  1.000000 0.000000 0.0000000.000000 1.000000 0.0000000.000000 0.000000 1.000000filter: EDID: 00ffffffffffff0009d10185010000002619010368301b78ee0db0a755499b25155054a7ef80d1c08100810f818081c0a9c0b3000101023a801871382d40582c4500dd0c1100001a000000fd00384b1e5312000a202020202020000000fc0042656e5120444c323230360a20000000ff00455446394630303333303030560013_MUTTER_PRESENTATION_OUTPUT: 0 Content Protection: Undesired supported: Undesired, Desired, EnabledColorspace: Default supported: Default, RGB_Wide_Gamut_Fixed_Point, RGB_Wide_Gamut_Floating_Point, opRGB, DCI-P3_RGB_D65, BT2020_RGB, BT601_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, BT2020_CYCC, BT2020_YCCmax bpc: 12 range: (6, 12)Broadcast RGB: Automatic supported: Automatic, Full, Limited 16:235audio: auto supported: force-dvi, off, auto, onsubconnector: VGA supported: Unknown, VGA, DVI-D, HDMI, DP, Wireless, Nativelink-status: Good supported: Good, BadCONNECTOR_ID: 103 supported: 103non-desktop: 0 range: (0, 1)1920x1080 (0x47) 148.500MHz +HSync -VSync *current +preferredh: width  1920 start 2008 end 2052 total 2200 skew    0 clock  67.50KHzv: height 1080 start 1084 end 1089 total 1125           clock  60.00Hz

于是猜测,是否由于另外一个显示器的信息还在系统中导致此问题。

通过如下命令,关闭另外一个显示接口的输出:

xrandr --output DP-2 --off

此时再切换显示器,则可以正常显示ubuntu桌面信息。

复制屏

也称为mirrors ,即两个显示器显示同样的内容。

通过xrandr也可以进行配置。

但是配置复制屏幕不能解决此问题。

可视化提示信息

需求:

1) 关键信息字体 特殊标识:例如 显示器A。

当前连接 显示器A。

2) 采用ubuntu自带软件。

xlib库

通过下面的代码可以显示一个窗口及文字提示,而且xlib库不需要单独安装。但是从下面图中可以看到,其中的文字很小,不符合要求。而要调整文字大小,通过xlib库相当繁琐。

如下代码for死循环是必须的,不然会很快退出,看不到窗口。

/** 下边是编译命令* gcc x11.c -o zhdisplay_test  -I/usr/X11R6/include -L/usr/X11R6/lib -lX11*/#include 
#include 
#include 
#include 
#include 
#include 
#include #define XK_Escape 0xFF1Bint main(int argc,char *argv[])
{Display *display;Window window;XEvent event;KeySym key_symbol;    char msg[] = {"Test VGA"};    int s;int i = 0;int win_width;int win_height;if (argc<2)memcpy(msg, "Test VGA",strlen(msg));else{if (!strncmp(argv[1],"DPB",3))memcpy(msg, "Test DPB",strlen(msg));if (!strncmp(argv[1],"DPC",3))memcpy(msg, "Test DPC",strlen(msg));  /* 与Xserver建立连接 */display = XOpenDisplay(NULL);if (display == NULL){fprintf(stderr, "Cannot open display\n");exit(1);}s = DefaultScreen(display);    win_width = DisplayWidth(display, s);win_height = DisplayHeight(display, s);printf("w:%d,h :%d\n",win_width,win_height);/* 创建一个窗口 */window = XCreateSimpleWindow(display, RootWindow(display, s), win_width/2, 0, win_width/2, win_height, 1,BlackPixel(display, s), WhitePixel(display, s));/* 选择一种感兴趣的事件进行监听 */XSelectInput(display, window, ExposureMask | KeyPressMask);/* 显示窗口 */XMapWindow(display, window);/* 事件遍历 */for (;;){XNextEvent(display, &event);  // 阻塞函数/* 绘制窗口或者重新绘制 */if (event.type == Expose){//TO DO }/* 当检测到键盘按ESC键,退出消息循环 */if (event.type == KeyPress){key_symbol = XkbKeycodeToKeysym(display, event.xkey.keycode, 0,0);if  (XK_Escape == key_symbol) {break;}}XDrawString(display, window, DefaultGC(display, s), win_width/4-10, win_height/2, msg, strlen(msg));         }       /* 关闭与Xserver服务器的连接 */XCloseDisplay(display); return 0;}

图像显示命令

于是,考虑用是否有系统命令可以直接显示图片,结论是可以的。

如下两个命令,带图片名称就可以打开

xdg-open

问题: 通过pkill 杀掉此命令对应的进程时,图片窗口还在。

eog

可以被pkill杀死。eog 输出,可以看到提示信息清晰。

在此基础上,我们可以设计各种各样的底色图片,对显示接口进行测试。

解决这个问题在于思路的转变,从代码层面转换到工具层面,体现解决问题的灵活性。

参考资料

linux 视频输出xrandr设置命令 - 简书 (jianshu.com)

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...