ubuntu20.04.3LTS 实现gnome终端选中复制右键粘贴功能

前言

笔者在使用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开源还是比较好的,直接修改源码来达到自己的目的,就是比较麻烦,然后编译过程还会需要自己看日志分析错误,比较折腾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值