qnx 根据IDstring 获取screen_window_t
时间: 2023-10-23 21:11:48 浏览: 51
对于QNX操作系统,您可以使用函数`screen_window_find_by_id`来根据ID字符串获取`screen_window_t`。该函数的原型如下:
```
screen_window_t screen_window_find_by_id(const char *idstring);
```
其中,`idstring`参数是您要查找的窗口的ID字符串。如果找到了匹配的窗口,则该函数返回指向该窗口的`screen_window_t`句柄;否则返回`NULL`。
需要注意的是,使用该函数需要您先初始化`libscreen`库。您可以使用`screen_init`函数来初始化该库,具体如下:
```
screen_context_t screen_ctx;
screen_create_context(&screen_ctx, SCREEN_APPLICATION_CONTEXT);
if (screen_init(screen_ctx, 0) != 0) {
// 初始化失败
return -1;
}
// 使用 screen_window_find_by_id 函数查找窗口
```
在使用完`screen_window_t`句柄后,您需要调用`screen_destroy_window`函数来销毁该窗口。
相关问题
screen_get_window_property_pv源码
`screen_get_window_property_pv()` 函数是 QNX Screen API 中的函数,用于获取屏幕窗口的属性值。以下是该函数的源码实现(参考自 QNX 官方文档):
```c
int screen_get_window_property_pv(screen_window_t window, int name, void **value) {
int rc;
int count;
int size;
rc = screen_get_window_property_iv(window, name, &count);
if (rc || !count) {
return rc ? rc : (count ? EINVAL : ENOENT);
}
switch (name) {
case SCREEN_PROPERTY_RENDER_BUFFERS:
case SCREEN_PROPERTY_STREAM_SRC:
case SCREEN_PROPERTY_STREAM_DST:
case SCREEN_PROPERTY_CLIPBOARD:
case SCREEN_PROPERTY_ZORDER:
case SCREEN_PROPERTY_TRANSPARENCY:
case SCREEN_PROPERTY_USAGE:
case SCREEN_PROPERTY_COLOR:
case SCREEN_PROPERTY_COLOR_SPACE:
case SCREEN_PROPERTY_COMPOSITION_MODE:
case SCREEN_PROPERTY_FORMAT:
case SCREEN_PROPERTY_FLIP:
case SCREEN_PROPERTY_GLOBAL_ALPHA:
case SCREEN_PROPERTY_SCALE_QUALITY:
case SCREEN_PROPERTY_MIRROR:
case SCREEN_PROPERTY_PROTECTION_ENABLE:
case SCREEN_PROPERTY_PROTECTION_REGIONS:
case SCREEN_PROPERTY_PROPERTY:
case SCREEN_PROPERTY_WINDOW:
case SCREEN_PROPERTY_DISPLAY:
case SCREEN_PROPERTY_DEVICE:
case SCREEN_PROPERTY_CONTEXT:
case SCREEN_PROPERTY_GROUP:
size = sizeof(screen_handle_t);
break;
case SCREEN_PROPERTY_ID_STRING:
size = SCREEN_ID_STRING_SIZE;
break;
case SCREEN_PROPERTY_BUFFER_SIZE:
case SCREEN_PROPERTY_PHYSICAL_SIZE:
case SCREEN_PROPERTY_SOURCE_SIZE:
case SCREEN_PROPERTY_RENDER_BUFFER_COUNT:
case SCREEN_PROPERTY_UPDATE_SIZE:
case SCREEN_PROPERTY_SIZE:
case SCREEN_PROPERTY_POSITION:
case SCREEN_PROPERTY_SOURCE_POSITION:
case SCREEN_PROPERTY_CLIP_POSITION:
case SCREEN_PROPERTY_CLIP_SIZE:
size = sizeof(int[2]);
break;
case SCREEN_PROPERTY_SOURCE_CLIP_POSITION:
case SCREEN_PROPERTY_SOURCE_CLIP_SIZE:
size = sizeof(int[4]);
break;
case SCREEN_PROPERTY_STRIDE:
case SCREEN_PROPERTY_BUFFER_COUNT:
case SCREEN_PROPERTY_USAGE_HINTS:
case SCREEN_PROPERTY_ALPHA_MODE:
case SCREEN_PROPERTY_SWAP_INTERVAL:
case SCREEN_PROPERTY_IDLE_MODE:
case SCREEN_PROPERTY_IDLE_STATE:
size = sizeof(int);
break;
case SCREEN_PROPERTY_FORMAT_COUNT:
rc = screen_get_window_property_iv(window, SCREEN_PROPERTY_FORMAT_COUNT, &count);
size = count * sizeof(int);
break;
case SCREEN_PROPERTY_BLEND_GLOBAL_ALPHA:
size = sizeof(screen_blending_t);
break;
default:
return EINVAL;
}
*value = calloc(count, size);
if (!*value) {
return ENOMEM;
}
rc = screen_get_window_property_iv(window, name, *value);
if (rc) {
free(*value);
*value = NULL;
return rc;
}
return 0;
}
```
该函数首先调用 `screen_get_window_property_iv()` 函数获取指定属性的值,并检查返回值和属性值的数量。如果返回值为 0 且属性值数量为非零,则继续处理。否则,返回相应的错误码。
然后,根据不同的属性类型和名称,设置不同的属性值大小,并调用 `calloc()` 函数分配内存空间。接着,再次调用 `screen_get_window_property_iv()` 函数获取属性值,并将其存储在分配的内存空间中。
最后,返回 0 表示操作成功,返回其他值则表示出现错误。
eglCreateWindowSurface与screen_create_window的关系
在 QNX 系统中,`eglCreateWindowSurface()` 与 `screen_create_window()` 是紧密相关的。`screen_create_window()` 是 QNX Screen API 中的函数,用于创建一个屏幕窗口。而 `eglCreateWindowSurface()` 是 EGL API 中的函数,用于创建一个与窗口系统关联的 EGL 渲染表面。
在使用 EGL 和 QNX Screen 开发图形界面应用程序时,通常的做法是先使用 `screen_create_window()` 函数创建一个屏幕窗口,然后使用 `screen_get_window_property_cv()` 函数获取窗口的属性值,例如窗口的大小和位置等。接下来,将窗口属性值传递给 `eglCreateWindowSurface()` 函数,即可创建一个与窗口关联的 EGL 渲染表面。
因此,`eglCreateWindowSurface()` 函数和 `screen_create_window()` 函数是配合使用的,前者用于创建 EGL 渲染表面,后者用于创建屏幕窗口。通过将窗口属性值传递给 `eglCreateWindowSurface()` 函数,EGL 渲染表面可以与屏幕窗口关联起来,从而实现基于 OpenGL ES 的图形界面应用程序。