显示接口测试

背景需求

两个显示器连接到一台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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

proware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值