背景需求
两个显示器连接到一台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 268mm
Identifier: 0x43
Timestamp: 545969
Subpixel: unknown
Gamma: 1.0:1.0:1.0
Brightness: 1.0
Clones:
CRTC: 2
CRTCs: 0 1 2
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
EDID:
00ffffffffffff0009d1018501000000
2619010368301b78ee0db0a755499b25
155054a7ef80d1c08100810f818081c0
a9c0b3000101023a801871382d40582c
4500dd0c1100001a000000fd00384b1e
5312000a202020202020000000fc0042
656e5120444c323230360a20000000ff
00455446394630303333303030560013
_MUTTER_PRESENTATION_OUTPUT: 0
Content Protection: Undesired
supported: Undesired, Desired, Enabled
Colorspace: 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_YCC
max bpc: 12
range: (6, 12)
Broadcast RGB: Automatic
supported: Automatic, Full, Limited 16:235
audio: auto
supported: force-dvi, off, auto, on
subconnector: VGA
supported: Unknown, VGA, DVI-D, HDMI, DP, Wireless, Native
link-status: Good
supported: Good, Bad
CONNECTOR_ID: 103
supported: 103
non-desktop: 0
range: (0, 1)
1920x1080 (0x47) 148.500MHz +HSync -VSync *current +preferred
h: width 1920 start 2008 end 2052 total 2200 skew 0 clock 67.50KHz
v: 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 0xFF1B
int 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)