...
而FDE的weston窗口是运行在麒麟系统之上的,所以考虑为weston窗口创建自定义的x11光标,将weston client的光标内容提取出来并给到新创建的x11光标,然后隐藏Android光标和weston client光标,让x11光标作为FDE的光标进行显示。如下图所示:
...
第二阶段优化方案中的关键流程如下图所示:
...
调试过程中的关键调用栈信息:
...
Android的hwcomposer将Android光标图层过滤并提取图形buffer数据,最后通过wayland协议调用wl_pointer_set_cursor接口将创建好的cursor_surface光标图层设置到weston光标。Android hwcomposer和weston间会基于libwayland-server.so库进行相关调用,最后weston的pointer_set_cursor方法会被调用。在此方法中能得到Android hwcomposer端设置的cursor_surface。并最终将cursor_surface内容贴到weston光标上。
而在weston光标转x11光标优化方案里,在pointer_set_cursor方法中我们可以得到weston光标图层weston_surface,根据weston_surface的宽高信息开辟一段临时内存空间用于存储weston光标图形数据,通过weston_surface_copy_content提取到weston光标的图形数据并保存到临时开辟的内存空间中。最后通过调用新增的函数set_custom_cursor创建并设置x11光标,同时调用pointer_unmap_sprite将weston光标隐藏。创建设置x11光标功能实现参照了libxcursor库,其中的一些关键方法有XcursorImageCreate、XcursorImageLoadCursor、XCreatePixmap、XCreateGC、XPutImage、XRenderCreatePicture、XRenderCreateCursor。