screen_get_window_property_pv源码
时间: 2023-07-30 22:08:10 浏览: 71
`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 表示操作成功,返回其他值则表示出现错误。