前言
笔者在使用Ubuntu20.04.3LTS 的时候对自带的终端gnome终端使用很不习惯,使用的方式是选中鼠标中键粘贴,类似macOS的iterm的默认能力,但是iterm的是可以设置的。gnome终端却不行,securecrt使用习惯了,那么怎么实现选中复制右键粘贴呢。
1. 分析
选中复制,右键粘贴是2种事件:鼠标释放事件、鼠标右击事件。
Ubuntu20.04.3LTS使用gnome桌面,要实现gnome终端自定义功能,但是设置缺失相关设置,😅
只能设置鼠标快捷键,此时我们只能自己修改源代码了,来实现我们的逻辑。
2. 实现
上面分析了,要实现这些功能,需要2种事件处理,其中gnome终端已经实现右键事件,我们需要实现鼠标选中释放事件并修改右键事件的处理逻辑。开干
2.1 获取gnome终端源码
apt-get source gnome-terminal
但是会获取失败,原因是我们没有打开源码获取,打开软件和更新,按照下图所示:
2.2 安装gnome编译环境
sudo apt-get build-dep gnome-terminal
如果缺失第三方lib就手动安装
2.3 源码修改
实际上要修改的源码只有gnome-terminal-3.36.2/src/terminal-screen.c(笔者使用的gnome终端版本)
1) 定义事件函数
static gboolean terminal_screen_button_press (GtkWidget *widget,
GdkEventButton *event);
//增加按压释放事件
static gboolean terminal_screen_button_release (GtkWidget *widget,
GdkEventButton *event);
在按压事件后增加释放事件
2) 绑定按压释放事件的执行函数
static void
terminal_screen_class_init (TerminalScreenClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
VteTerminalClass *terminal_class = VTE_TERMINAL_CLASS (klass);
GSettings *settings;
object_class->constructed = terminal_screen_constructed;
object_class->dispose = terminal_screen_dispose;
object_class->finalize = terminal_screen_finalize;
object_class->get_property = terminal_screen_get_property;
object_class->set_property = terminal_screen_set_property;
widget_class->realize = terminal_screen_realize;
widget_class->style_updated = terminal_screen_style_updated;
widget_class->drag_data_received = terminal_screen_drag_data_received;
widget_class->button_press_event = terminal_screen_button_press;
//绑定事件的执行函数
widget_class->button_release_event = terminal_screen_button_release;
3)修改右键事件的执行函数逻辑
if (event->type == GDK_BUTTON_PRESS && event->button == 3)
{
if (!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)))
{
// 注释很明了,右键逻辑
/* on right-click, we should first try to send the mouse event to
* the client, and popup only if that's not handled. */
//if (button_press_event && button_press_event (widget, event))
//return TRUE;
//terminal_screen_do_popup (screen, event, hyperlink, url, url_flavor, number_info);
//注释上面3行代码逻辑,直接调用粘贴函数
vte_terminal_paste_clipboard (VTE_TERMINAL (screen));
hyperlink = NULL; /* adopted to the popup info */
url = NULL; /* ditto */
number_info = NULL; /* ditto */
return TRUE;
}
else if (!(event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
{
/* do popup on shift+right-click */
terminal_screen_do_popup (screen, event, hyperlink, url, url_flavor, number_info);
hyperlink = NULL; /* adopted to the popup info */
url = NULL; /* ditto */
number_info = NULL; /* ditto */
return TRUE;
}
}
4)实现选中复制函数
static gboolean
terminal_screen_button_release (GtkWidget *widget,
GdkEventButton *event){
gboolean ret;
TerminalScreen *screen = TERMINAL_SCREEN (widget);
gboolean (* button_release_event) (GtkWidget*, GdkEventButton*) =
GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_release_event;
ret = FALSE;
if (button_release_event){
ret = button_release_event (widget, event);
}
if (event->button == 1){
gboolean can_copy;
can_copy = vte_terminal_get_has_selection (VTE_TERMINAL (screen));
if (can_copy)
vte_terminal_copy_clipboard (VTE_TERMINAL (screen));
}
return ret;
}
2.4 编译安装
改好源码后,在gnome-terminal-3.36.2目录执行
dpkg-buildpackage -us -uc -b
或者
debuild -b
编译会报错,但是实际上已经构建完成,只是执行gpg的时候缺少密匙
直接看
2.5 安装deb
sudo dpkg -i gnome-terminal_3.36.2-1ubuntu1~20.04_amd64.deb
安装完成,重启终端,就可以实现选中复制右键粘贴了。而且编译安装,性能最佳。
3. 注意换源情况
这里注意如果Ubuntu的gnome比较新,然后换源后,获取到旧的gnome终端代码,那么在编译过程中就会使用旧的函数导致编译报错,建议使用官方源获取最新源码,编译环境。
Ubuntu换源/etc/apt/sources.list
最好备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list(可将vim更换为自己熟悉的编辑器)
#添加阿里源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#添加清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse multiverse
总结
Ubuntu开源还是比较好的,直接修改源码来达到自己的目的,就是比较麻烦,然后编译过程还会需要自己看日志分析错误,比较折腾。