QNX Screen使用说明书

前言

写在前面:QNX_SCREEN 实践性强,逻辑复杂,很多API非要体验过一次才能理解,导致包括我在内的初学者感觉晦涩难懂,不明觉厉,因此将自己的理解写下来、整理下来,与君共勉。
该文档为本人学习过程整理记录内容,如有侵权,联系删除。

screen介绍

QNX screen系统是一个图形框架,提供开发时图像显示功能,抽象对外统一接口,屏蔽底层硬件差异
screen是基于client/server模型,screen进程是server程序,OpenWFD进程是client程序,libscreen/libEGL/libGLESv2提供了对外的API函数
screen支持应用程序渲染和硬件加速
screen支持插件,加载特定的硬件模块,例如显示硬件模块,2D/3D加速器(GPU)和输入设备等资源

QNX_IMG相关API:IMG_API

QNX_SCREEN相关API:SCREEN_API

screen API组件架构

QNXAPI组件架构

Context: context为窗口化环境中的图形操作提供了设置。除Event外,所有screen对象的访问都是相对于该对象关联的上下文而言。通过它可以获取到对对象(比如windows,groups,displays,pixmaps)的访问权限,用于设置或者更改其属性。

Buffer: buffer是存储像素数据的内存区域,将buffer关联到Windows、Streams或Pixmaps后,screen将可以使用它。多个buffers可以与一个windows或stream关联,但是一个buffer只能与一个pixmap关联。

Device: device指的是输入设备,例如键盘,鼠标,触摸屏等,可以与指定的显示关联

Displays: display是指呈现图像的物理设备,例如触摸屏或者显示屏,使用相关接口可以获取其属性,包括供应商,显示技术,视频模式等。

Event: event包含窗口的创建,属性设置,键盘、鼠标、触摸事件之类的动作。event可独立于context关联创建事件

Groups: groups用于组织和管理应用程序中的多个窗口。同一组的窗口属性具有继承关系。因此,对窗口组的某些属性更改会对所有属于该组的窗口产生影响。父窗口创建一个组,子窗口可以加入,子窗口继承其父窗口的属性,但也可以独立于父窗口进行设置和检索属性

Pixmaps: pixmap是用于在screen之外进行目标渲染, 然后将目标和screen buffer关联后进行显示。

Sessions: session允许应用程序将原始的Event事件转成更高级的事件。session允许应用程序捕获特定区域,设备或者screen事件,与通过windows相比,它可以提供对于输入事件的更多控制

Streams: stream允许图形内容由组件生成和处理,使用stream,无需将图像内容和显示器关联,内容可以由screen以外的组件使用,同时,也可以使用screen来关联显示。

Windows: window代表一个绘图界面,其内容用于显示。有多种类型的窗口(应用程序窗口,子窗口和嵌入式窗口)可以容纳要显示的内容。

screen context 创建

除Event外,所有screen API组件都必须于context关联,所有screen的应用程序的第一步是创建context

enum {
    SCREEN_APPLICATION_CONTEXT = 0,
    SCREEN_WINDOW_MANAGER_CONTEXT = (1 << 0),
    SCREEN_INPUT_PROVIDER_CONTEXT = (1 << 1),
    SCREEN_POWER_MANAGER_CONTEXT = (1 << 2),
    SCREEN_DISPLAY_MANAGER_CONTEXT = (1 << 3),
    SCREEN_INPUT_MANAGER_CONTEXT = (1 << 4),
    SCREEN_BUFFER_PROVIDER_CONTEXT = (1 << 5)
};
screen_context_t screen_ctx;
screen_create_context(&screen_ctx, SCREEEN_APPLICATION_CONTEXT);

SCREEN_APPLICATION_CONTEXT: 允许进程创建自己的窗口并控制窗口的某些属性。应用程序不能修改其他应用程序创建的窗口,也不能在其进程空间之外发送事件。

SCREEN_WINDOW_MANAGER_CONTEXT: 它允许进程在创建或者销毁新的应用程序窗口时修改系统中所有窗口。当应用程序创建新窗口,销毁现有窗口或尝试更改某些窗口属性时,此context也会收到通知。进程必须具有对/dev/screen/.winmgr具有写访问权限,才能创建此类型的context。

SCREEN_INPUT_PROVIDER_CONTEXT: 它允许将进程将时间发送到系统中的任何应用程序。 当应用程序创建新窗口,销毁现有窗口或尝试更改某些窗口属性时,此context不会收到通知。进程必须是对/dev/screen/.provider具有写访问权的用户或组ID,才能创建此类型的context。

SCREEN_POWER_MANAGER_CONTEXT: 请求context提供对电源管理功能的访问,以便更改显示电源模式。进程必须是对/dev/screen/.powmgr具有写访问权的用户或组ID,才能创建此类型的context。

SCREEN_DISPLAY_MANAGER_CONTEXT: 允许进程修改系统中的所有显示属性。进程必须具有root用户ID以及是对/dev/screen/.dpymgr具有写访问权的用户或组ID,才能创建此类型context。

SCREEN_INPUT_MANAGER_CONTEXT: 允许向进程通知所有已创建的input sessions并修改特定的sessions属性。进程必须是对/dev/screen/.inmgr具有写访问权的用户或组ID,才能创建此类型的context。

SCREEN_BUFFER_PROVIDER_CONTEXT: 允许进程附加其创建的buffers。除了选择附加的缓冲区外,context不会创建buffers。进程必须是对/dev/screen/.attach具有写访问权的用户或组ID,才能创建此类型的context

screen display 操作

在创建context之后,需要知道context中哪些显示以及多少显示可以使用
使用SCREEN_PROPERTY_DISPLAY_COUNT属性获取context中可用的display数量

int ndisplays = 0;
screen_context_t screen_ctx;
screen_get_context_property_iv(screen_ctx, SCREEN_PROPERTY_DISPLAY_COUNT, &ndisplays);

使用查询返回的显示数量,分配足够的内存以检索指向screen_display_t的指针数组

screen_display_t *screen_dpy = calloc(ndisplays, sizeof(screen_display_t));

检索显示数组

screen_get_context_property_pv(screen_ctx, SCREEN_PROPERTY_DISPLAYS, (void **)screen_dpy);

获取显示数组中的对应display id以及显示屏的尺寸

for(i = 0; i < ndisplays; ++i)
{
    int display_id;
    int size[2];
    screen_get_display_property_iv(screen_dpy[i], SCREEN_PROPERTY_ID, &display_id);
    screen_get_display_property_iv(screen_dpy[i], SCREEN_PROPERTY_SIZE, size);
}

screen window创建

创建一个窗口,与context绑定

screen_create_window(&screen_window,screen_ctx);

设置窗口的用法属性

SCREEN_USAGE_READ: 程序可以从关联的缓冲区中读取的标识

SCREEN_USAGE_WRITE: 程序可以写入与对象关联的缓冲区的标志

SCREEN_USAGE_NATIVE: 与对象绑定的缓冲区可用于本地API操作,如果使用screen_blit()或 screen_fill()必须设置此标识

SCREEN_USAGE_OPENGL_ES1: 使用OpenGL ES 1.X呈现与对象关联的缓冲区的标识

SCREEN_USAGE_OPENGL_ES2: 使用OpenGL ES 2.X呈现与对象关联的缓冲区的标识

SCREEN_USAGE_OPENGL_ES3: 使用OpenGL ES 3.X呈现与对象关联的缓冲区的标识

SCREEN_USAGE_OPENVG: 使用OpenVG呈现与对象关联的缓冲区的标志。

SCREEN_USAGE_VIDEO: 表示视频解码器可以写入缓冲区的标识

SCREEN_USAGE_CAPTURE: 表示缓冲区可以由捕获设备(例如摄像机,模数转换器等)写入并由硬件视频编码器读取的标识

SCREEN_USAGE_ROTATION: 表示缓冲区可以从横向重新配置为纵向的标志,而无需重新分配

SCREEN_USAGE_OVERLAY: 使用display overlay标识,如果需要重新分配pipeline,则需要使用此标识

SCREEN_USAGE_COMPRESSION: 压缩缓冲区标识

SCREEN_USAGE_PHYSICAL: 缓冲区在物理上应该连续并且应该提供物理地址的标志

int usage = SCREEN_USAGE_NATIVE;
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_USAGE, &usage);
enum {
    SCREEN_USAGE_DISPLAY = (1 << 0),
    SCREEN_USAGE_READ = (1 << 1),
    SCREEN_USAGE_WRITE = (1 << 2),
    SCREEN_USAGE_NATIVE = (1 << 3),
    SCREEN_USAGE_OPENGL_ES1 = (1 << 4),
    SCREEN_USAGE_OPENGL_ES2 = (1 << 5),
    SCREEN_USAGE_OPENGL_ES3 = (1 << 11),
    SCREEN_USAGE_OPENVG = (1 << 6),
    SCREEN_USAGE_VIDEO = (1 << 7),
    SCREEN_USAGE_CAPTURE = (1 << 8),
    SCREEN_USAGE_ROTATION = (1 << 9),
    SCREEN_USAGE_OVERLAY = (1 << 10),
    SCREEN_USAGE_COMPRESSION = (1 << 12),
    SCREEN_USAGE_PHYSICAL = (1 << 13)
};

指定窗口名称。指定窗口名称可以在多个窗口存在时有效的辨别窗口的从属

const char *winid = "qnx_screen"
screen_set_window_property_cv(screen_window, SCREEN_PROPERTY_ID_STRING, strlen(winid), winid);

设置窗口格式。窗口在显示前需要指定输入的buffers中的数据格式

int format = SCREEN_FORMAT_RGBA8888;
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_FORMAT, &format);

设置窗口显示大小。窗口显示可以根据应用的显示区域需求进行缩放,默认是全屏

int size[2] = {1920, 720};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_SIZE, size);

设置窗口显示位置。窗口位置可以根据应用的显示区域进行移动,屏幕左上角位置为{0, 0}

int pos[2] = {0, 0};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_POSITION, pos);

设置显示层级。默认层级为0,数字越大显示越在上面,同样层级的应用,后触发显示的应用会显示在上面

int zorder = 101;
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_ZORDER, &zorder);

设置窗口显示的display pipeline ID
pipeline ID 一般由 Graphics_conf文件配置,一般由项目架构分配图层硬pipeline
例如高通8295芯片最多支持12张物理屏,即最多可以分配12个硬pipeline
但是单独display pipeline可支持多个应用显示,显示需应用内部分配软pipeline,软pipeline不限个数
硬pipeline可以用来解耦部分软件功能,但是要注意两个pipeline之间的同步问题

int disp_idx = 0;
screen_set_window_property_pv(screen_window, SCREEN_PROPERTY_DISPLAY, (void **)&screen_dpy[disp_idx]);

设置窗口缓冲区大小

int bsize[2] = {1920, 720};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_BUFFER_SIZE, bsize);

是否显示窗口,设置1为显示,0为隐藏。默认为1

int vis = 1;
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_VISIBLE, &vis);

screen 创建子窗口

如果一个窗口属于另外一个窗口的一个组件,那么可以将此窗口创建为子窗口,子窗口会继承父窗口的大部分属性,同时也可以单独设置其属性。父窗口隐藏或退出,子窗口也会跟随父窗口,这个可以保证应用的各个组件可以同步操作。

以字符串形式检索窗口ID,以便子窗口可以使用它来加入此窗口的组。SCREEN_PROPERTY_ID属性能保证获取的窗口ID在该系统中是唯一的

char window_group_name[64];
screen_get_window_property_cv(screen_window, SCREEN_PROPERTY_ID, sizeof(window_group_name), window_group_name );

创建一个子窗口

screen_window_t screen_child_window;
int wintype = SCREEN_CHILD_WINDOW;
screen_create_window_type(&screen_child_window, screen_ctx, wintype );

加入父窗口组

screen_join_window_group(screen_child_window,window_group_name);

创建内部缓冲区

创建一个内部缓冲区, 需要指定创建buffers的数量

int num_bufs = 1;
screen_create_window_buffers(screen_window, num_bufs);

设置buffers数据格式

int format = SCREEN_FORMAT_RGBA8888;
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_FORMAT, &format);

设置buffers大小

int bsize = {19201080};
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_BUFFER_SIZE,  bsize);

设置stride

int stride = bsize[0] * bpp / 8;
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_STRIDE, &stride);

设置offset //如果是YUV planar格式,例如NV12,需要设置此属性

int offset[3]; 
offset[0] = 0; 
offset[1] = bsize[1] * stride; 
offect[2] = -1;
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_STRIDE, &stride);

创建外部缓冲区

使用外部缓冲区,context必须使用SCREEN_BUFFER_PROVIDER_CONTEXT标志

设置需要创建的buffers的数量,用于缓存

#define MAX_BUFS_CNT 6
int buf_idx = 0;
int bufs_cnt = MAX_BUFS_CNT;
for(buf_idx =0; buf_idx < bufs_cnt; buf_idx++) {
}

创建一个缓冲区句柄,可以将其附加到窗口或像素图上

screen_buffer_t screen_bufs;
screen_create_buffer(screen_bufs[buf_idx]);

设置buffers数据格式

int format = SCREEN_FORMAT_RGBA8888;
screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_FORMAT, &format);

设置buffers size

int bsize = {19201080};
screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_BUFFER_SIZE,  bsize);

设置stride

int stride = bsize[0] * bpp / 8;
screen_set_buffer_property_iv(screen_bufs, SCREEN_PROPERTY_STRIDE, &stride);

设置buffer 大小

int buf_capacity = stride * bsize[1];
screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_SIZE,  &buf_capacity);

设置offset, 如果是YUV planar格式,例如NV12,需要设置此属性

int offset[3]; offset[0] = 0; offset[1] = bsize[1] * stride; offect[2] = -1;
screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_STRIDE, &offset);

根据外部传入的物理地址获取虚拟地址

unsigned *vaddr[MAX_BUFS_CNT];
vaddr[buf_idx] = mmap_device_memory(0, attr->buf_capacity, PROT_READ | PROT_WRITE, 0, phyaddr[buf_idx]);

将screen的buf指针指向外部缓冲区

screen_set_buffer_property_pv(screen_bufs[buf_idx], SCREEN_PROPERTY_POINTER, (void **)&vaddr[buf_idx]);

将缓冲区与窗口关联

screen_attach_window_buffers(screen_window, MAX_BUFS_CNT, screen_bufs);

screen post windows

在显示屏上刷新窗口内容

int rects[4] = {0, 0, 1920, 1080};
int count = 1;
screen_post_window(screen_window, screen_bufs[idx],  count, rects, SCREEN_WAIT_IDLE);

rects中包含一个窗口矩形的x,y 坐标,宽度和高度。注意x,y坐标是相对坐标,相对与窗口的偏移位置
最后一个参数可以调整screen_post_window接口的同步与异步,建议使用同步的接口,异步的话渲染显示完成时间要比同步接口久一些

SCREEN_WAIT_IDLE: 使用SCREEN_WAIT_IDLE时,当使用SCREEN_post_window()调用的缓冲区更新显示,并且至少有一个渲染缓冲区时,此函数才会返回。

SCREEN_DONT_BLOCK: 使用SCREEN_ONT_BLOCK时,无论渲染缓冲区当前是否可用,此函数都会立即返回。使用此标志的接口后,请勿使用SCREEN_PROPERTY_RENDER_BUFFERS。相反,请使用screen_dequeue_window_render_buffer()来等待下一个可用的渲染缓冲区。

0: 使用0时,如果至少有一个渲染缓冲区可用,则此函数会立即返回,同时遵守窗口的交换间隔。

例如已经调用了screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_POSITION, pos);设置了窗口位置,那么此时x,y坐标应该是相对与这个pos的位置。

screen 剪辑缓冲区

当根据需求只需要显示一个指定的区域时,如图所示,可以在一个大的缓冲区中剪辑一个特定的区域用于显示。注意,只能剪辑一个矩形
在这里插入图片描述

设置窗口缓冲区和源尺寸

int src_size[2] = {1920, 720};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_BUFFER_SIZE, src_size);
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_SOURCE_SIZE, src_size);

设置剪辑尺寸

int clip_size[2] = {1280, 720};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_SOURCE_CLIP_SIZE, clip_size);

设置剪辑相对偏移位置

int clip_pos[2] = {0, 0};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_SOURCE_CLIP_POSITION, clip_pos);

设置显示窗口尺寸

int size[2] = {1280, 720};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_SIZE, size);

Input Event

在这里插入图片描述

输入事件表示某种形式的用户与应用程序的交互。Screen支持多种输入事件,包括键盘,鼠标,触摸,手柄,手势等,这里主要介绍触摸事件。例如动画跳过按钮使用了该方法。

创建一个event,以便事件数据的填充

screen_event_t screen_ev;
screen_create_event(&screen_ev);

等待screen事件。这里需要和screen context关联,此函数为阻塞函数,第三个参数为超时时间,单位为ns,-1表示事件准备就绪之前不返回。

screen_get_event(screen_ctx, screen_ev, -1);

等待screen事件。这里需要和screen context关联,此函数为阻塞函数,第三个参数为超时时间,单位为ns,-1表示事件准备就绪之前不返回。

SCREEN_EVENT_MTOUCH_TOUCH: 检测到touch的press事件
SCREEN_EVENT_MTOUCH_MOVE: 检测到touch的move事件
SCREEN_EVENT_MTOUCH_RELEASE: 检测到touch的release事件

int type;
screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_TYPE, &type);
enum {
    SCREEN_EVENT_NONE = 0,
    SCREEN_EVENT_CREATE = 1,
    SCREEN_EVENT_PROPERTY = 2,
    SCREEN_EVENT_CLOSE = 3,
    SCREEN_EVENT_INPUT = 4,
    SCREEN_EVENT_JOG = 5,
    SCREEN_EVENT_POINTER = 6,
    SCREEN_EVENT_KEYBOARD = 7,
    SCREEN_EVENT_USER = 8,
    SCREEN_EVENT_POST = 9,
    SCREEN_EVENT_DISPLAY = 11,
    SCREEN_EVENT_IDLE = 12,
    SCREEN_EVENT_UNREALIZE = 13,
    SCREEN_EVENT_GAMEPAD = 14,
    SCREEN_EVENT_JOYSTICK = 15,
    SCREEN_EVENT_DEVICE = 16,
    SCREEN_EVENT_INPUT_CONTROL = 17,
    SCREEN_EVENT_GESTURE = 18,
    SCREEN_EVENT_MANAGER = 19,
    SCREEN_EVENT_MTOUCH_PRETOUCH = 99,
    SCREEN_EVENT_MTOUCH_TOUCH = 100,
    SCREEN_EVENT_MTOUCH_MOVE = 101,
    SCREEN_EVENT_MTOUCH_RELEASE = 102
};

获取事件的坐标位置,对于触摸就是{x,y}轴坐标

int cur_pos[2];
screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_POSITION, cur_pos);

获取多点触摸的id,也就是按压的手指的id。

int touch_id;
screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_TOUCH_ID, &touch_id);

触摸事件一般是需要和display绑定的,也就是在使能一个mtouch时,需要指定display id,那么在使用Event获取触摸事件时,也是需要创建一个screen窗口用于获取指定窗口中的触发的触摸事件。

如果触摸事件不需要和display绑定,需要在使能mtouch时加上 -r 参数,这样会创建一个/dev/mtouch/touch_display0的节点,通过read此节点获取触摸事件。

sw-vsync 命令

创建一个全屏的背景以及一个运动的bar,用于检测屏的显示状况以及帧率等
在这里插入图片描述
QNX官方命令参数:sw-vsync

sw-vsync 参数配置:

sw-vsync   [-bg_rbga=background_color]
           [-display=display_id]
           [-double-buffer]
           [-format=pixel_format]
           [-frame-limit=frames]
           [-grid]
           [-interval=swap_interval]
           [-pipeline=pipeline]
           [-pos=x,y]
           [-single-buffer]
           [-size=widthxheight]
           [-transparency=transparency]
           [-zorder=zorder]


-bg_rgba=r,g,b,a, 设置背景颜色和alpha值,例如-bg_rgba=0xff,0xff,0,0xff,黄色不透明背景
-display=[int]or[str], 设置使用的display
-double-buffer,使用两个缓冲区
-format=[str], 设置窗口显示格式
-frame_limit=[int], 设置最大的渲染帧数
-gird,显示网格
-interval=[int],设置刷新间隔数
-pipeline,指定pipeline id
-pos=[x],[y], 设置显示偏移位置
-single-buffer,使用一个渲染缓冲区
-size=[width]x[height],设置窗口尺寸
-transparency=[str],设置窗口的透明模式
-zorder=[int],设置窗口的z-order

gles2-gears 命令

使用OpenGL ES 2.x显示硬件渲染的内容
在这里插入图片描述
QNX官方命令参数:gles2-gears

gles2-gears命令参数:

gles2-gears [-bg-alpha=background_alpha_value]
            [-brightness=brightness]
            [-config=egl_configuration]
            [-contrast=contrast]
            [-display=display_id]
            [-double-buffer]
            [-fg-alpha=foreground_alpha_value]
            [-frame-limit=frame_limit]
            [-hue=hue]
            [-interval=swap_interval]
            [-pipeline=pipeline_id]
            [-pos=x,y]
            [-saturation=saturation]
            [-single-buffer]
            [-size=widthxheight]
            [-transparency=transparency_mode]
            [-verbose]
            [-zorder=zorder]

-bg-alpha=background_alpha_value, 设置背景alpha值,范围为[0.0f..1.0f],默认值为0.0f
-brightness=brightness, 设置窗口亮度,范围为[-255..255], 默认是显示硬件的亮度
-config = egl_configuration,设置可选的EGL的配置说明符,说明符包括像素格式,多重采样或EGL配置符
-contrast=contrast, 设置窗口对比度,范围为[128..127]
-display= display_id,设置使用的display
-double-buffer,使用EGL_BACK_BUFFER(默认)作为EGL surface的EGL_RENDER_BUFFER属性
-fg-alpha=foreground_alpha_value, 设置前景的alpha值,范围为[0.0f..1.0f],默认为1.0f
-frame-limit=frame_limit, 设置渲染的帧数
-hue=hue, 设置窗口的色调,范围为[-128..127]
-interval=swap_interval, 设置刷新间隔数
-pipeline=pipeline_id. 设置pipeline
-pos=x,y, 设置窗口偏移位置
-saturation=saturation. 设置饱和度,范围为[-128..127]
-single-buffer, 使用EGL_SINGLE_BUFFER 作为EGL surface的EGL_RENDER_BUFFER属性
-size=widthxheight, 设置窗口的宽度和高度
-transparency=transparency_mode, 设置窗口透明度模式
-verbose, 打印级别
-zorder=zorder, 设置z-order

screencmd 命令

修改screen对象的属性

一个程序在创建screen组件完成后,screen进程会将程序设置的一些信息输出在/dev/screen/process name/win-id 文件中。

cat /dev/screen/<process name>/<win-id> 后会看到screen的相关信息。

id = __scrn-win-7-00000023-e8deb591790c5becdf276f09b210b3d0
id string = camera_23237c5660_0
permissions = rwxrwx--x--x--x--x--x---
acl = (empty)
locks = (none)
display = dpy-1
status = FULLY VISIBLE
type = SCREEN_APPLICATION_WINDOW
autonomous = 0
references = 1
window manager = (none)
window manager string =
pipeline id = 6
pipeline bound = false
parent = (none)
children = (none)
window above = (none)
window below = (none)
alternate window = (none)
root window = (none)
reclip = 0
updates = 0
valid = WINDOW_SIZE
class =
flags = WIN_FLAG_VISIBLE WIN_FLAG_FLOATING
buffer size = 1920x1080
format = SCREEN_FORMAT_rgb888
color space = SCREEN_COLOR_SPACE_UNCORRECTED
usage = SCREEN_USAGE_READ SCREEN_USAGE_WRITE SCREEN_USAGE_NATIVE
order = 3000
swap interval = 1
default = ssn-0
sessions = *ssn-0
streams = str-3
holes = (none)
regions = (0,0;1280,720)
flip = 0
mirror = 0
scale mode = (default)
source viewport = (0,0 1920x1080)
source clip rectangle = (0,0;1920,1080)
clipped source viewport = (0,0;1920,1080 1920x1080)
destination rectangle = (0,0 1280x720)
clipped destination rectangle = (0,0;1280,720 1280x720)
rotation = 0
clipped rotation = 0
transform = [[0.664063 0 0],[0 0.664063 0],[0 0 1]]
transparency = SCREEN_TRANSPARENCY_SOURCE
color = 0xffcfcfcf
global alpha = 255 -> 255
brightness = 0 -> 0
contrast = 1 -> 1
hue = 0 -> 0
saturation = 0 -> 0
scale quality = 0
idle mode = normal
protection requested = (none)
protection enabled = (none)
cbabc mode = SCREEN_CBABC_MODE_NONE
metrics.dropped = 0
metrics.visible.partial = 19775000000
metrics.visible.full = 19775000000
metrics.updates.count = 197
metrics.updates.pixels = 408 Mpixels
metrics.updates.reads = 4901 Mbytes

id: screen窗口的唯一标识符,在创建窗口时生成,可调用SCREEN_PROPERTY_ID标志获取

id string: 窗口名称,可调用SCREEN_PROPERTY_ID_STRING标志设置以及获取

permissions: 窗口权限,可调用SCREEN_PROPERTY_PERMISSIONS标志设置以及获取

display: display id,可调用SCREEN_PROPERTY_ID标志获取。dpy-1表示窗口在display id 1上

status: 显示状态,可调用SCREEN_PROPERTY_STATUS标志获取。FULLY表示显示在显示屏上,VISIBLE表示是可见的,FULL表示全屏显示,INVISIBLE表示窗口隐藏

pipeline id: 使用的pipeline, 可调用SCREEN_PROPERTY_PIPELINE标志设置以及获取,该pipeline为软pipeline

pipeline bound: 是否主动绑定pipeline。如果代码中主动调用SCREEN_PROPERTY_PIPELINE标志设置使用的pipeline,这里就会显示true。如果pipeline的相关配置有问题,这里也会显示一些错误信息

parent: 父窗口信息

children: 子窗口信息

window above: 显示在当前进程窗口上面的窗口所在的进程名,显示层级由z-order决定

window below: 显示在当前进程窗口下面的窗口所在的进程名,显示层级由z-order决定

alternate window: 备用窗口对象,可调用SCREEN_PROPERTY_ALTERNATE标志设置或者获取。它的主要作用是虚拟一个对象,通过它可以将一个display上的鼠标指针移动到另外一个display上。

root window: 根窗口,在创建窗口时指定SCREEN_ROOT_WINDOW标志。根窗口用于管理和控制其子级的层次结构和更新率

valid: 显示程序设置的一些窗口属性,例如设置SCREEN_PROPERTY_SIZE,SCREEN_PROPERTY_SOURCE_SIZE等

flags: 显示程序当前的一些状态,例如VISIBLE, STATIC, FLOATING等

buffer size: buffer的尺寸, 可调用SCREEN_PROPERTY_BUFFER_SIZE标志设置或者获取

format: 数据格式,可调用SCREEN_PROPERTY_FORMAT标志设置或者获取

color space: 色彩空间类型,可调用SCREEN_PROPERTY_COLOR_SPACE标志设置或者获取

usage: 窗口用法属性,可调用SCREEN_PROPERTY_USAGE标志设置或者获取

order: 窗口层级,可调用SCREEN_PROPERTY_ZORDER标志设置或者获取,即zorder值

swap interval: 缓冲区刷新间隔,可调用SCREEN_PROPERTY_SWAP_INTERVAL标志设置或者获取。0表示在更新显示时要更新窗口缓冲区;大于0表示窗口按照显示屏的(刷新率 / swap interval)的刷新率进行刷新,与屏幕刷新频率同步相关,还有类似的垂直同步等…

regions: 显示区域,regions = (0,0;1280,720),0,0表示偏移位置,可使用SCREEN_PROPERTY_POSITION标志设置或者获取;1280,720表示显示区域大小,注意这个大小是加上了偏移位置,也就是1280 = 实际显示宽度 + 宽度的偏移

scale mode: scale模式设置,可调用SCREEN_PROPERTY_SCALE_MODE标志设置和获取

source viewport: 缓冲区源区域, source viewport = (0,0 1920x1080),0,0表示偏移位置,可以调用SCREEN_PROPERTY_SOURCE_POSITION标志设置和获取;1920x1080表示源大小,可调用SCREEN_PROPERTY_SOURCE_SIZE标志设置和获取。

source clip rectangle: 源裁剪区域。source clip rectangle = (0,0;1920,1080),0,0表示裁剪源位置偏移,可调用SCREEN_PROPERTY_SOURCE_CLIP_POSITION标志设置或获取;1920,1080表示源的大小,主要它是相对于偏移位置,但是不能超过源的最大值

clipped source viewport: 源裁剪展示。 clipped source viewport = (0,0;1920,1080 1920x1080),0,0表示源裁剪偏移位置,1920,1080表示源裁剪大小,1920x1080表示源的大小

destination rectangle: 目标显示大小,可通过SCREEN_PROPERTY_POSITION和SCREEN_PROPERTY_SIZE标志设置或获取显示位置偏移和大小

rotation: 图像翻转。 可通过SCREEN_PROPERTY_ROTATION表示设置翻转度数

transparency: 透明类型,可通过SCREEN_PROPERTY_TRANSPARENCY标示设置或者获取

color: 设置背景色,可通过SCREEN_PROPERTY_COLOR标志设置或者获取

global alpha: 设置透明度,可通过SCREEN_PROPERTY_GLOBAL_ALPHA标志设置或者获取

screencmd使用:

示例:

screencmd setcv grp-11 SCREEN_PROPERTY_NAME "My Group Name"
screencmd setiv win-1 SCREEN_PROPERTY_BUFFER_SIZE 100,100
screencmd setpv win-1 SCREEN_PROPERTY_ALTERNATE win-2
screencmd setllv dpy-1 SCREEN_PROPERTY_IDLE_TIMEOUT 1234
screencmd setgp win-1 "My Group Name"
screencmd apply

基本语法:

screencmd <property-value/format> <object> <property name> <value>

property-value/format:
表示要应用于属性的值的类型,取决于你想要设置的属性。

命令属性值类型/格式
setcv想要设置一个字符串属性
setgp对象应该加入的组的名称
setiv要将属性设置为整数或以逗号分隔的整数列表。(例如,1920,720)
setllv要将属性设置为的长整数
setpv要将属性设置为的屏幕对象,指定对象的方法与指定对象参数的方法相同

object:
指定要改变属性的目标对象,通过<对象类型前缀>-的形式指定对象。对象类型的ID可以通过查看屏幕调试文件来确定,例如/dev/screen/mem。screencmd支持以下Screen对象,并列出了它们的关联前缀:

Screen对象前缀
contextctx-
devicedev-
displaydpy-
groupgrp-
pixmappix-
sessionssn-
streamstr-
windowwin-

比如一个window类型对象的ID为1,那么win-1就可以用来表示这个对象。

property name:
要应用于Screen对象的属性。screencmd支持每种对象类型的所有有效属性。这个属性名称的前提是要改变的Screen对象要这个属性,这个属性是大小写不敏感的,并且提供这个属性而不加上SCREEN_PROPERTY_前缀是可以接受的。例如,下面的命令是等效的:

screencmd setiv win-1 SCREEN_PROPERTY_ZORDER 1
screencmd setiv win-1 zorder 1

示例:
将ID为1的window对象的SCREEN_PROPERTY_SIZE属性设置为400x800:

screencmd setiv win-1 size 400,800

将ID为6的window对象的透明度设置为全透明:

screencmd setiv win-6 global_alpha 0

终于写完了,后面还会更新代码示例…

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 QNX Screen 使用范例,用于创建一个窗口并显示一段文本: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <screen/screen.h> int main(int argc, char **argv) { // 创建屏幕上下文 screen_context_t context; screen_create_context(&context, 0); // 创建屏幕窗口 screen_window_t window; screen_create_window(&window, context); // 设置窗口大小和位置 int size[2] = {640, 480}; int pos[2] = {0, 0}; screen_set_window_property_iv(window, SCREEN_PROPERTY_SIZE, size); screen_set_window_property_iv(window, SCREEN_PROPERTY_POSITION, pos); // 将窗口提交到屏幕显示 screen_post_window(window, context, 0); // 显示文本 char *text = "Hello, QNX Screen!"; int len = strlen(text); int font_size = 24; int text_color[4] = {255, 255, 255, 255}; int bg_color[4] = {0, 0, 0, 255}; int text_pos[2] = {100, 100}; screen_buffer_t buf; screen_create_window_buffers(window, 1); screen_get_window_property_pv(window, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&buf); screen_fill(ctx, buf, bg_color); screen_draw_text(ctx, buf, text, len, text_pos[0], text_pos[1], SCREEN_TEXT_ALIGNMENT_LEFT, font_size, text_color); // 将绘制的内容提交到屏幕显示 int rect[4] = {0, 0, size[0], size[1]}; screen_post_window(window, buf, 1, rect, 0); // 等待用户输入 getchar(); // 销毁窗口和上下文 screen_destroy_window(window); screen_destroy_context(context); return 0; } ``` 以上代码中,首先使用 `screen_create_context()` 函数创建一个屏幕上下文,然后使用 `screen_create_window()` 函数创建一个窗口,并设置窗口大小和位置。接下来,使用 `screen_post_window()` 函数将窗口提交到屏幕显示。 然后,使用 `screen_draw_text()` 函数在窗口中绘制一段文本,并使用 `screen_post_window()` 函数将绘制的内容提交到屏幕显示。最后,使用 `getchar()` 函数等待用户输入,销毁窗口和上下文后返回。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值