寫在前面

其實這個問題本來一個月前就打算解決來着, 沒想到居然拖到了現在 (懶癌晚期啊)。

緣由

雖然說 Linux 作爲桌面系統時, 軟件相對於 Windows 和 MacOS 少了很多。

但是在這少數的軟件中, 重複造輪子的還是不要太多。

截圖工具也是如此, 在試過衆多的截圖工具後, 喜歡上了 FlameShot

截圖後有臨時編輯功能,不僅輕量還很好看呢。

不過用了幾次後, 發現它有一個逼死強迫症的問題:

每次截圖後 FlameShot 不會自己退出。

截圖並不一個常用的功能,每次截圖後, 還佔着一個托盤位置看着實在礙眼 (所以 GNOME 就把托盤功能砍了?)

具體實現

本來打算根據程序退出後的狀態碼來判斷是否截圖成功 (如果取消了截圖就立即 Kill 掉, 如果截圖成功就等待圖像編輯完成後再 Kill)。

結果發現這貨居然不管什麼情況都返回的是 0。

逛了一圈 Issues, 發現這個問題其實在一個 PR 中已經修復了 — Exit non-zero when aborting with –raw

不過不知爲啥會無效, 好在因爲這個 PR 意外的發現 –raw 參數有妙用。

代碼

然後寫了個 Shell 以不太優雅的方式解決了這個問題 (點擊 此處 下載腳本)

#!/bin/bash

# @Author: 文正•喵
# @E-Mail: ivlioioilvi@outlook.com

#
# 自定義 FlameShot 行爲
#

# 截取整個桌面
entire_Desktop() {
    # 開始截圖
    flameshot full --raw --path "$HOME/Pictures/"
    # 等待 2 秒
    sleep 2s
    # 結束 FlameShot
    killall flameshot
}

# 手動截圖
manual_Capture() {
    # 開始截圖
    flameshot gui  --raw --path "$HOME/Pictures/"
    # 等待 2 秒
    sleep 2s
    # 結束 FlameShot
    killall flameshot
}

# 幫助頁
manual_Page() {
    echo  -e "
    Usage: _flameshot [options] [arguments]

    Options:
    -h, --help     Displays this help
    -v, --version  Displays version information

    Arguments:
    full           Capture the entire desktop.
    select         Start a manual capture in GUI mode.
    "
}

# 版本信息
show_Version() {
    echo -e "
    _flameshot v_0.0.1

    It is written in the scripting language Bash.
    "
}

# 參數判斷
case "$1" in
"-h")
    manual_Page
    ;;
"--help")
    manual_Page
    ;;
"-v")
    show_Version
    ;;
"--version")
    show_Version
    ;;
"full")
    entire_Desktop
    ;;
"select")
    manual_Capture
    ;;
*)
    echo -e "
    No options/arguments were used or the wrong options/arguments were used.

    Use the -h/-help option for detailed help.
    "
    ;;
esac

釋疑

截圖後爲何要等待 2 秒

是爲了讓 FlameShot 在截圖後有時間寫入文件到磁盤 (2 秒已足夠)。

爲何要加 –raw 參數

至於爲何我也不是很清楚,不靠譜的猜測一下。

如果不加 –raw 參數, 腳本的第 10 / 20 行中的動作幾乎是一瞬間就執行完成, 然後再繼續執行下面的語句 (儘管 FlameShot 還在後臺運行)。

這樣的話就不能再使用編輯截圖的功能了,因爲只有 2 秒的時間來編輯 (2 秒後 FlameShot 會被 Kill 掉)。

而加了這個參數,FlameShot 就會一直處於前臺,直到截圖完成或者取消截圖 (截圖完成就輸出原始的 PNG,如果中途取消截圖,就輸出 screenshot aborted)。

拓展閱讀

魚和熊掌不可兼得

如果要讓 FlameShot 截圖後就被 Kill 掉, 那麼就不能使用 截圖後複製到剪切版 這個功能了。

這是 X剪切板 機制所決定的。

鍵盤流

有時候我們想要抓住遊戲中精彩的一瞬間, 電影中搞笑的那一刻。

如果這時還要在程序菜單中慢慢找到截圖程序, 再打開截圖,就太慢了。

機會總是轉瞬即逝的。

所以這時候使用快捷鍵就很方便了, 比如我的做法是:

將上述的腳本以 _flameshot 名稱保存到 PATH 中, 然後在 i3wm 的配置文件中分配不同的快捷來鍵執行此腳本。

bindsym $mod+m mode "+Multimedia"
mode "+Multimedia" {
    bindsym f exec --no-startup-id _flameshot full         ,mode "default"
    bindsym Shift+f exec --no-startup-id _flameshot select ,mode "default"
    bindsym Escape mode "default"
    bindsym Return mode "default"
    bindsym $mod+m mode "default"
}

按下 Win + M 鍵後,再按下 F 鍵可進行全屏截圖。

按下 Win + M 鍵後,再按下 Shift + F 鍵可手動選擇區域進行截圖。

可還行?

用了幾次,感覺效果還行。