Archlinux (KDE) 实现贴图快捷键功能

2023.4.16更新:使用maim替换scrot,同时实现了贴图保持在原位置的功能。

看到标题,有人可能会说:“贴图?用Flameshot不就可以行了吗?”但是,它在缩放率非100%的KDE桌面上无法工作啊(贴图位置和大小失真)。。。

然而,何不用其他简单的组件搭建起一个贴图快捷键功能呢?

一、思路

我们的目的是将贴图绑定到一个快捷键上,只要按下它,你就能框选屏幕上的一块矩阵区域,选择完毕后会自动弹出刚才所选择的截图,保持它置顶,并且在原来截图的位置上。

能实现吗?其实思路很简单:

  1. 准备一款自带框选截图功能的命令行截图软件和一个简洁的图片查看器
  2. 使用命令将刚才截取的图片传递给图片查看器予以显示,并指定窗口显示的位置
  3. 图片查看器提前设置为置顶状态、不显示窗口边框

二、教程

本文使用maim作为截图软件,它不仅能完美地实现我们所需要的功能,而且还十分稳定(不像Flameshot和Spectacle那样时不时出岔子)。

图片查看器使用的是viewnior,主打的就是界面简洁(否则贴图的效果不是很美观)。

首先下载必要的软件:

yay -Syu maim viewnior

之后,打开viewnior,右击窗口边框,选择更多操作-配置更多应用程序设置,添加“保持在其他窗口之上”“无标题栏和边框”的属性,将其设置为“是”。右击打开的viewnior窗口内部,取消“工具栏”的打勾。

在~/bin目录(或你喜欢的位置)里添加以下脚本:

#!/bin/bash
# 使用 slop 选择截图的区域
rect=$(slop --highlight --color=0.3,0.4,0.6,0.6 -f "%x %y %w %h" -D)
if [[ $rect != "" ]]
then
    # 截取所选择的区域并保存为临时文件
    tmp_file=$(echo ~/Pictures/pin/$(date -I'seconds').png)

    # 获取截图的位置和尺寸
    pos_x=$(echo $rect | awk '{print $1}')
    pos_y=$(echo $rect | awk '{print $2}')
    width=$(echo $rect | awk '{print $3}')
    height=$(echo $rect | awk '{print $4}')

    # 自定义图片查看器的位置和大小,并打开截图
    maim -g ${width}x${height}+${pos_x}+${pos_y} $tmp_file
    gtk-launch viewnior $tmp_file --class=Viewnior && sleep 0.6 && xdotool search --onlyvisible --classname "Viewnior" windowsize $width $height windowmove $pos_x $pos_y
fi

然后,打开KDE设置-快捷键-自定义快捷键-新建-全局快捷键-命令/URL,将其命名为“贴图”。触发器设置为你喜欢的快捷键。操作中的命令设置为上面的脚本文件路径:

其他关于maim的参数说明详见maim(1)。最后,点击“应用”。

现在,你可以欣赏你的贴图功能了!

贴图位于中央位置(我保留了viewnior的工具栏,否则分不清贴图和背景)

三、注意事项

  • 贴图窗口位置不在原截图位

将脚本最后一行中的sleep时间适度延长。

  • 如何移动贴图窗口?

在KDE中,可以按住Meta键,同时使用鼠标左键拖动窗口。这在KDE设置-窗口管理-窗口行为-窗口操作中可以设置。

  • 如何改变贴图大小?

在KDE中,可以按住Meta键,同时使用鼠标右键拖动窗口,可以改变窗口大小。之后,你可以使用鼠标滚轮放大、缩小图片,或者更方便的,右键菜单里选择“最佳尺寸”。

  • 如何关闭贴图窗口?

如果你保留了工具栏,可以点击工具栏的右上角,里面有“关闭”按钮。又或者,你可以向我一样使用touchegg设置关闭窗口的触摸板手势,这当然更方便。