新闻网网站安全建设百度登录首页
背景需求
两个显示器连接到一台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 <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <X11/XKBlib.h>#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)