除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
在创建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);
}
- 创建一个窗口,与context绑定
screen_create_window(&screen_window,screen_ctx);
- 设置窗口的用法属性
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) };
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:缓冲区在物理上应该连续并且应该提供物理地址的标志
- 指定窗口名称。指定窗口名称可以在多个窗口存在时有效的辨别窗口的从属
const char *winid = "test"
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, 1080};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_SIZE, size);
- 设置窗口显示位置。窗口位置可以根据应用的显示区域进行移动,屏幕左上角位置为{0, 0}
int pos[2] = {100, 100};
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_POSITION, pos);
- 设置显示层级。默认层级为0,数字越大显示越在上面,同样层级的应用,后触发显示的应用会显示在上面
int zorder = 10;
screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_ZORDER, &zorder);
- 设置窗口显示的display。
int disp_idx = 0;
screen_set_window_property_pv(screen_window, SCREEN_PROPERTY_DISPLAY, (void **)&screen_dpy[disp_idx]);
- 设置窗口缓冲区大小
int bsize[2] = {1920, 1080};
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);