desktop shell强相关的一共分如下几部分:

1.client/desktop-shell.c + window.c

2.desktop-shell目录

3.libweston-desktop部分\

1是desktop客户端的实现,因为桌面本身也是一个负责和weston交互的客户端。

2是负责大多数desktop-shell.c里面的实现,如创建鼠标,键盘,窗口布局,窗口效果。

3则是xdg一些独立于desktop的实现,在任何窗口都有可能需要用到。

一句话来说,desktop-shell目录是一些具体的特殊的情况,而libweston-desktop则是一些普遍的实现

desktop-shell.c

main...config相关,如panel位置(就是显示时间那一行),显示的时间格式等等...###########display_createdesktop.display = display_create(&argc, argv);d->display = wl_display_connect(NULL);//Connect to the Wayland display named \c name.
If \c name is \c NULL,its value will be replaced with the WAYLAND_DISPLAY
environment variable if it is set, otherwise display "wayland-0" will be used.
如果有多个监听的节点(可能是多个server,或者单一server但是监听多个节点),这个时候就可以决定对应的客户端与那个socket节点通信。d->xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);//键盘输入相关
https://wayland-book.com/seat/xkb.html//epoll, handle_display_data是对应的处理事件,
主要是wl_display_dispatch和wl_display_flushd->epoll_fd = os_epoll_create_cloexec();d->display_fd = wl_display_get_fd(d->display);d->display_task.run = handle_display_data;display_watch_fd(d, d->display_fd, EPOLLIN | EPOLLERR | EPOLLHUP,&d->display_task);wl_list_init(&d->deferred_list);wl_list_init(&d->input_list);wl_list_init(&d->output_list);//这个对应实际的屏幕,outputwl_list_init(&d->global_list);//这个是gloabel object的列表,如下会全部保存一份         //注册绑定对应的global服务d->registry = wl_display_get_registry(d->display);wl_registry_add_listener(d->registry, &registry_listener, d);//registry_handle_global里面把所有的global interface全部装在之前创建的 global_list里面:global = xmalloc(sizeof *global);global->name = id;global->interface = strdup(interface);global->version = version;wl_list_insert(d->global_list.prev, &global->link);#ifdef HAVE_CAIRO_EGL              //init_eglif (init_egl(d) < 0)create_cursors(d);                 //鼠标 https://invisible-island.net/xterm/xcursor/xcursor.htmld->theme = theme_create();         //主要是和窗口主题相关内容,比方说,窗口背后阴影
窗口的帮助栏大小等等。比较复杂,目前不理解wl_list_init(&d->window_list);init_dummy_surface(d);            //貌似和weston桌面鼠标停留左上角terminal的info有关##########//初始化desktop.display对象的data,global_handler和globale_handler_removedisplay_set_user_data(desktop.display, &desktop);display_set_global_handler(desktop.display, global_handler);//此处会注册绑定
weston_desktop_shell和wl_output接口,这里面很有意思,先来的信号是wl_output//因为先来的是wl_output,那么create_output里面的if(desktop->shell)就不会成功,
也就不会在这里创建panel和backgroundglobal_handler...} else if (!strcmp(interface, "wl_output")) {create_output(desktop, id);if (desktop->shell) {output_init(output, desktop);...display_set_global_handler_remove(desktop.display, global_handler_remove);##########创建background和panel的地方weston_desktop_shell_set_panel_position(desktop.shell, desktop.panel_position); //对应desktop-shell文件夹里面实现的weston_desktop_shell_interface->desktop_shell_set_panel_positionwl_list_for_each(output, &desktop.outputs, link)if (!output->panel)output_init(output, &desktop);output->panel = panel_create(desktop, output);surface = window_get_wl_surface(output->panel->window);weston_desktop_shell_set_panel(desktop->shell,output->output, surface);output->background = background_create(desktop, output);surface = window_get_wl_surface(output->background->window);weston_desktop_shell_set_background(desktop->shell,output->output, surface);##########grab_surface_create(&desktop);        //应该是用鼠标设置窗口大小时候的那个手一样的surface
由下面的desktop_shell_set_grab_surface支持display_run(desktop.display);

整个desktop client不使用xdg-shell相关。

参考weston目录下的weston-desktop-shell.xml;

client在绑定desktop-shell的时候,实现了会从server那边收到的三个消息:configure,prepare_lock_surface,grab_cursor。

并在绑定wl_output的时候实现了create_output,这是显而易见的,因为我们可以从wl_output_protocol里面获取屏幕大小等用来创建全局窗口的有用信息。

desktop-shell里面的接口:

static const struct weston_desktop_shell_interface desktop_shell_implementation = {desktop_shell_set_background,desktop_shell_set_panel,desktop_shell_set_lock_surface,desktop_shell_unlock,desktop_shell_set_grab_surface,desktop_shell_desktop_ready,desktop_shell_set_panel_position
};

xdg-shell里面有几套接口,分别是:

static const struct xdg_wm_base_interface weston_desktop_xdg_shell_implementation = {.destroy = weston_desktop_destroy_request,.create_positioner = weston_desktop_xdg_shell_protocol_create_positioner,.get_xdg_surface = weston_desktop_xdg_shell_protocol_get_xdg_surface,.pong = weston_desktop_xdg_shell_protocol_pong,
};

在client 端bind wm_base以后提供的接口,可以通过wl_surface获取xdg_surface。

static const struct xdg_surface_interface weston_desktop_xdg_surface_implementation = {.destroy             = weston_desktop_destroy_request,.get_toplevel        = weston_desktop_xdg_surface_protocol_get_toplevel,.get_popup           = weston_desktop_xdg_surface_protocol_get_popup,.set_window_geometry = weston_desktop_xdg_surface_protocol_set_window_geometry,.ack_configure       = weston_desktop_xdg_surface_protocol_ack_configure,
};

在获取xdg_surface以后,可以通过上述接口获得具体的角色,toplevel或者popup。

static const struct weston_desktop_surface_implementation weston_desktop_xdg_surface_internal_implementation = {/* These are used for toplevel only */.set_maximized = weston_desktop_xdg_toplevel_set_maximized,.set_fullscreen = weston_desktop_xdg_toplevel_set_fullscreen,.set_resizing = weston_desktop_xdg_toplevel_set_resizing,.set_activated = weston_desktop_xdg_toplevel_set_activated,.set_size = weston_desktop_xdg_toplevel_set_size,.get_maximized = weston_desktop_xdg_toplevel_get_maximized,.get_fullscreen = weston_desktop_xdg_toplevel_get_fullscreen,.get_resizing = weston_desktop_xdg_toplevel_get_resizing,.get_activated = weston_desktop_xdg_toplevel_get_activated,/* These are used for popup only */.update_position = weston_desktop_xdg_popup_update_position,/* Common API */.committed = weston_desktop_xdg_surface_committed,.ping = weston_desktop_xdg_surface_ping,.close = weston_desktop_xdg_surface_close,.destroy = weston_desktop_xdg_surface_destroy,
};

这一部分是内部用的,并不是暴露给client的,而是用来和weston\desktop-shell目录所生成的desktop-shell.so对接,是desktop-shell.so里面功能的实现。

static const struct xdg_popup_interface weston_desktop_xdg_popup_implementation = {.destroy             = weston_desktop_destroy_request,.grab                = weston_desktop_xdg_popup_protocol_grab,
};
static const struct xdg_toplevel_interface weston_desktop_xdg_toplevel_implementation = {.destroy             = weston_desktop_destroy_request,.set_parent          = weston_desktop_xdg_toplevel_protocol_set_parent,.set_title           = weston_desktop_xdg_toplevel_protocol_set_title,.set_app_id          = weston_desktop_xdg_toplevel_protocol_set_app_id,.show_window_menu    = weston_desktop_xdg_toplevel_protocol_show_window_menu,.move                = weston_desktop_xdg_toplevel_protocol_move,.resize              = weston_desktop_xdg_toplevel_protocol_resize,.set_min_size        = weston_desktop_xdg_toplevel_protocol_set_min_size,.set_max_size        = weston_desktop_xdg_toplevel_protocol_set_max_size,.set_maximized       = weston_desktop_xdg_toplevel_protocol_set_maximized,.unset_maximized     = weston_desktop_xdg_toplevel_protocol_unset_maximized,.set_fullscreen      = weston_desktop_xdg_toplevel_protocol_set_fullscreen,.unset_fullscreen    = weston_desktop_xdg_toplevel_protocol_unset_fullscreen,.set_minimized       = weston_desktop_xdg_toplevel_protocol_set_minimized,
};

这两部分是给client使用的,对接client端具体角色的具体功能的接口

display:weston:desktop xdg-shell相关推荐

  1. display:weston渲染流程:commit

    接上一篇 display:weston渲染流程:buffer+attach+damage+frame display:weston渲染流程:buffer+attach+damage+frame_maz ...

  2. display:weston:weston-simple-egl

    写在前面: 客户端渲染 在Wayland架构中,客户端UI的所有呈现均由客户端代码执行,通常由客户端使用的图形工具包执行. 图形工具箱可以使用其希望呈现UI元素的任何方法:在CPU上进行软件呈现,使用 ...

  3. display:weston的client端绘画[subsurface,fullscreen]

    weston的源代码里面有关于client的绘画例子 建议追踪https://github.com/wayland-project/weston/blob/master/clients/ 增加一种功能 ...

  4. display:Weston:怎么让某个surface永远置于顶层

    问题如标题:假设我有一个app.想一直置于顶层,那么我可以怎么做? 1.drm-master权限问题 想办法拿掉weston或者说drm关于master权限的处理,然后自己基于libdrm画一个即可. ...

  5. display: weston: opaque region笔记

    client的设置方法: region = wl_compositor_create_region(window->display->compositor); wl_region_add( ...

  6. 解决问题帖--weston desktop pannel(桌面标题栏)去除方法

    我们都知道可以通过配置weston.ini来配置weston的桌面,但是不管是在示例里面还是在man界面里都没有提到如何设置桌面标题栏的位置或者去除标题栏. 通过查看代码才发现了配置选项: //无标题 ...

  7. display:weston:weston-simple-egl: server端

    接上篇:https://blog.csdn.net/u012839187/article/details/112415876 surface_attch以及surface_damage相关就不讲了,参 ...

  8. 修改weston桌面背景

    背景 linux开发板采用weston桌面系统, 希望修改默认桌面图片: 结果 在/etc/xdg/weston/weston.ini中新增: [shell] panel-location=botto ...

  9. 非常详尽,多图慎入:Wayland与Weston简介

    简单地说,Wayland是一套display server(Wayland compositor)与client间的通信协议,而Weston是Wayland compositor的参考实现.其官网为h ...

  10. Linux Shell 只列出目录的方法

    在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ls 命令的 -d 选项: $ ls -d */ Desktop/ pic/ shell/ src/ 2. 利用 ls 命 ...

最新文章

  1. Autodesk Motionbuilder 2016中文版
  2. 虚拟机中centos安装gcc
  3. .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务
  4. [转]maven与java命名规则
  5. 以太网交换机的概念,网络接口和主要特点
  6. 字符设备驱动高级篇5——静态映射表、动态映射结构体方式操作寄存器
  7. html按钮样式_一组强大的CSS3 Material 按钮
  8. docker 运行mysql镜像_docker 生成mysql镜像启动时自动执行sql
  9. linux tar权限不够,Linux用户,群组,权限 ,tar命令
  10. 凉山火灾启示录:面对大火,AI 能做些什么?
  11. Qt抽奖圆盘(减速效果)
  12. 文件加密新招--WinRAR文件加密(上)
  13. 硅谷产品联盟合伙人:每一个伟大产品的背后
  14. 【iOS】【最新】2022苹果开发者账号注册流程
  15. SNIP——“自适应”型“狙击”策略 (目标检测)(two-stage)(深度学习)(CVPR 2018)
  16. 【新书推荐】Interpretable Machine Learning with Python
  17. 傲慢与偏见之 - 因果倒置的锦上添花
  18. ffmpeg重采样中swr_convert和swr_get_out_samples的用法
  19. 为什么有时优盘是只读模式_u盘只读设置怎么弄? u盘只读设置使用方法
  20. MQTT断线重连订阅无法接收

热门文章

  1. Photoshop使用十大技巧
  2. 关于python画太阳花
  3. 开启Windows 10隐藏的电源卓越性能模式
  4. 微生物组-扩增子16S分析和可视化(2022.10)
  5. 如何把用Word文档转换成PNG图片
  6. Elasitcsearch CPU 使用率突然飙升,怎么办?
  7. 量子计算机epr,从EPR到量子信息[转] - 物理 - 小木虫 - 学术 科研 互动社区
  8. 计算机断层扫描法原理,能谱计算机断层扫描成像的概念和基本原理.PDF
  9. 通过调用百度生成短连接API接口,将长链接转换成短链接,并且生成短网址并返回,用户可以通过短连接访问,然后浏览器会解析跳转至长链接地址,有效的解决用户修改url后面的参数
  10. 苹果新园区最新内部效果图流出