问题如标题:假设我有一个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,那么需要如下:

android dialog 显示最上层 最上层显示权限怎么弄_git

  • 1,surface大概率对应一个view
  • 2,view对应layer来处理z order关系

解决办法:

  • 我们的下手点有两个,一个是把对应的view放在其他layer下面,如,放在fade layer下面
  1.  查看desktop-shell的初始化,有一个“shell_fade_init”;直接参照这个函数去处理就可以了,主要的重中之重就是
  2.   weston_layer_entry_insert(&compositor->fade_layer.view_list,  &view->layer_link);

 


  效果如下图,左上角的1/16是一个永远浮于上方的显示。

  1. 优点,容易实现。
  2. 缺点明显,layer的order太高了,那么任何其他的图层都不可能覆盖他,包括鼠标。
  1. 争对这个缺点,可以使用优先级低一点的layer解决。

android dialog 显示最上层 最上层显示权限怎么弄_desktop_02

简单的改动如下:

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的顺序提前

  1. weston_compositor_build_view_list
  1. 这个地方就是weston在准备渲染逻辑的时候讲对应的view排序的地方,也就是上图最右边一列
  2. 但是该如何调整顺序?
  1. 想到一种比较烂的方法,把所有的view提前做一次遍历,找到自己的view,然后塞在最上面。

对应的代码改动去查看这块逻辑:

  1. 将view的add过程进行两次拆分,可以同样实现。
  1. 但是就是对view的判定还有所不足,不知道应该怎么做。
  2. 遍历所花时间增加。
--- 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越小的,浮于最上层。