按键screenshot

前言

1 开始后weston client端服务启动

2 自定义按键截屏

3 实现分析

总结

前言
weston框架下,可以通过标准键盘的:WIN+s 实现截屏,但是如果我们要用自己的按键实现截屏又该如何操作呢?

1 开始后weston client端服务启动
weston会在启动时或按需起一些子进程,它们本质上是Weston的client,它们会通过专用的协议做一些系统应用的工作。如系统应用weston-desktop-shell负责一些系统全局的界面,比如panel, background, cursor, app launcher, lock screen等。它不作为weston服务本身的一部分,而是作为一个client。weston-keyboard是软键盘面板。weston-screenshooter和weston-screensaver分别用于截屏和屏保,它们都是按需才由Weston启动的。前者在截屏快捷键按下时启动,后者在需要锁屏时启动。

上图总结而言为:

1、weston-desktop-shell负责一些系统全局的界面,比如panel, background, cursor,     

      app launcher, lock screen等。

2、weston-keyboard是软键盘面板。

3、weston-screenshooter和weston-screensaver分别用于截屏和屏保,它们都是按  

      需才由Weston启动的。

2 自定义按键截屏
在笔者调试的嵌入式设备中, weston-screenshooter可执行程序的位置在:/usr/libexec。

weston-screenshooter的初始化位置应该是从应用层启动的,所以在weston/desktop-shell/shell.c中

wet_shell_init
   screenshooter_create
screenshooter_create中的内容为:

weston_compositor_add_key_binding(ec, KEY_S, MODIFIER_SUPER,
                screenshooter_binding, shooter);//截屏由win+S键触发
weston_compositor_add_key_binding(ec, KEY_R, MODIFIER_SUPER,
                recorder_binding, shooter);//录屏由win+R键触发
所以在此处添加自己的截屏处理按键绑定shooter即可,如:

weston_compositor_add_key_binding(ec, KEY_W, 0,
                screenshooter_binding, shooter);//截屏由W键触发
3 实现分析
weston_compositor_add_key_binding的内容为:

static void
screenshooter_binding(struct weston_keyboard *keyboard, uint32_t time,
              uint32_t key, void *data)
{
    struct screenshooter *shooter = data;
    char *screenshooter_exe;
    int ret;
 
    ret = asprintf(&screenshooter_exe, "%s/%s",
               weston_config_get_libexec_dir(),
               "/weston-screenshooter");
    if (ret < 0) {
        weston_log("Could not construct screenshooter path.\n");
        return;
    }
   
    if (!shooter->client)
        shooter->client = weston_client_launch(shooter->ec,
                    &shooter->process,
                    screenshooter_exe, screenshooter_sigchld);
    free(screenshooter_exe);
}
上述代码中screenshooter_exe为weston-screenshooter可执行文件的具体位置,weston_client_launch实现了screenshooter_exe的启动。具体实现为weston_client_launch中设置了一个fork进程,执行

child_client_exec(sv[1], path);
其中path即为weston-screenshooter可执行文件的位置。

总结
上述分析的可以通过下图进行表述


————————————————
版权声明:本文为CSDN博主「UNISOC-少林寺武功」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yikunbai5708/article/details/103845086/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值