天天看点

按键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启动的。前者在截屏快捷键按下时启动,后者在需要锁屏时启动。

按键screenshot

上图总结而言为:

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可执行文件的位置。

总结

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

按键screenshot