问题如标题:假设我有一个app。想一直置于顶层,那么我可以怎么做?
1.drm-master权限问题
- 想办法拿掉weston或者说drm关于master权限的处理,然后自己基于libdrm画一个即可。
2.枚举出另一个/dev/dri/cardX
- 可以想办法分出一个硬件的pipleline用来专门给这个显示用,同时枚举出另一个/dev/dri/cardX,然后自己写一个基于此card的绘图client即可。
- 这个方法的问题就是,本质上和cma有点像,这个单独分出来的硬件,永远不会被weston看到。
- 这个方法是不行的,因为不同card对应的connector也是不同的,那么就没办法显示到同一个屏幕上
3.for weston shell
- 如果是ivi,那么这个不是问题,因为ivi支持layer z-order的设置。
- 没有细看,看上去是ivi的做法是把所有的workspace-layer进行排序。不涉及其他layer
- 如果是desktop,那么需要如下:
- 1,surface大概率对应一个view
- 2,view对应layer来处理z order关系
解决办法:
- 我们的下手点有两个,一个是把对应的view放在其他layer下面,如,放在fade layer下面
- 查看desktop-shell的初始化,有一个“shell_fade_init”;直接参照这个函数去处理就可以了,主要的重中之重就是
- weston_layer_entry_insert(&compositor->fade_layer.view_list, &view->layer_link);
效果如下图,左上角的1/16是一个永远浮于上方的显示。
- 优点,容易实现。
- 缺点明显,layer的order太高了,那么任何其他的图层都不可能覆盖他,包括鼠标。
- 争对这个缺点,可以使用优先级低一点的layer解决。
简单的改动如下:
maze@maze-VirtualBox:~/Wayland/weston$ git diff ./
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index c1c126e8..b951a755 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -4064,9 +4064,9 @@ shell_fade_create_surface_for_output(struct desktop_shell *shell, struct shell_o
return NULL;
}
- weston_surface_set_size(surface, shell_output->output->width, shell_output->output->height);
+ weston_surface_set_size(surface, shell_output->output->width/4, shell_output->output->height/4);
weston_view_set_position(view, shell_output->output->x, shell_output->output->y);
- weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1.0);
+ weston_surface_set_color(surface, 0.0, 255.0, 0.0, 1.0); //weston_surface_attach如果attch了buffer。是否就能显示自己的图呢?
weston_layer_entry_insert(&compositor->fade_layer.view_list,
&view->layer_link);
pixman_region32_init(&surface->input);
@@ -4079,6 +4079,7 @@ shell_fade_create_surface_for_output(struct desktop_shell *shell, struct shell_o
static void
shell_fade(struct desktop_shell *shell, enum fade_type type)
{
+#if 0
float tint;
struct shell_output *shell_output;
@@ -4124,6 +4125,8 @@ shell_fade(struct desktop_shell *shell, enum fade_type type)
shell_fade_done_for_output, shell_output);
}
}
+#endif
+ printf("%s do nothing\n", __func__);
}
另外一种改动方法,想办法把view的顺序提前
- weston_compositor_build_view_list
- 这个地方就是weston在准备渲染逻辑的时候讲对应的view排序的地方,也就是上图最右边一列
- 但是该如何调整顺序?
- 想到一种比较烂的方法,把所有的view提前做一次遍历,找到自己的view,然后塞在最上面。
对应的代码改动去查看这块逻辑:
- 将view的add过程进行两次拆分,可以同样实现。
- 但是就是对view的判定还有所不足,不知道应该怎么做。
- 遍历所花时间增加。
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -2681,10 +2681,12 @@ weston_compositor_build_view_list(struct weston_compositor *compositor)
wl_list_for_each_safe(view, tmp, &compositor->view_list, link)
wl_list_init(&view->link);
wl_list_init(&compositor->view_list);
-
//提前遍历,找到view,然后view_list_add
+ int i =0;
wl_list_for_each(layer, &compositor->layer_list, link) { //把所有layer里面的所有的view,重新按序塞入compositor的view列表里面
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
view_list_add(compositor, view);
+ printf("index %d %s view x:%f y:%f w%d h%d\n", i, __func__, view->geometry.x, view->geometry.y, view->surface->width, view->surface->height);
+ i++;
}
}
///
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -2681,10 +2681,23 @@ weston_compositor_build_view_list(struct weston_compositor *compositor)
wl_list_for_each_safe(view, tmp, &compositor->view_list, link)
wl_list_init(&view->link);
wl_list_init(&compositor->view_list);
-
+
+ wl_list_for_each(layer, &compositor->layer_list, link) {
+ wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
+ if(layer->position > WESTON_LAYER_POSITION_NORMAL)
+ view_list_add(compositor, view);
+ if(layer->position == WESTON_LAYER_POSITION_NORMAL &&view->surface->width==250&&view->surface->height==250)
+ view_list_add(compositor, view);
+ if(layer->position < WESTON_LAYER_POSITION_NORMAL)
break;
+ }
+ }
+ int i =0;
wl_list_for_each(layer, &compositor->layer_list, link) {
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
- view_list_add(compositor, view);
+ if(layer->position <= WESTON_LAYER_POSITION_NORMAL &&(view->surface->width!=250||view->surface->height!=250))
+ view_list_add(compositor, view);
+// printf("index %d %s view x:%f y:%f w%d h%d\n", i, __func__, view->geometry.x, view->geometry.y, view->surface->width, view->surface->height);
+// printf("%lld\n", layer->position);
+// i++;
}
}
是否可以通过container_of想办法得到weston_desktop_surface->app_id or add_title之类的实现?
log:
index 0 weston_compositor_build_view_list view x:340.000000 y:382.000000 w32 h32
index 1 weston_compositor_build_view_list view x:0.000000 y:0.000000 w1024 h32
index 2 weston_compositor_build_view_list view x:209.000000 y:17.000000 w806 h491
index 3 weston_compositor_build_view_list view x:531.000000 y:345.000000 w250 h250
index 4 weston_compositor_build_view_list view x:0.000000 y:0.000000 w1024 h600
可以知道index越小的,浮于最上层。