GUIアプリケーション(pdf、jpgなど)を開くときに端末を非表示にして閉じたときに再表示するにはどうすればよいですか?

GUIアプリケーション(pdf、jpgなど)を開くときに端末を非表示にして閉じたときに再表示するにはどうすればよいですか?

alacritty私はデフォルトのシェルとしてTile WM(AwesomeWM)を使用します。 (端末で)ファイルを開くと、端末の横にある新しいウィンドウでファイルが開きます。

これは迷惑なことであり、私が望むものではありません。端末を閉じるとPDF(zathura)も閉じます。端末を最小限に抑えることができますが、よりエレガントなソリューションを探しています。

「サイレントモード」というものがあったことを覚えていますが、それが何なのかはよくわかりません。アイデアは、PDF(または画像など)が開かれると、端末が「消えて」PDFを閉じるまでそのまま残ります。この場合、端末が再び表示されます。

どのように動作するのか分からないし、見つけることもできないようです。誰でもアイデアがあればありがとうございます。

ベストアンサー1

これはで行うことができますxdotools。横に「最小化する」私たちができるターミナルマッピング解除ウィンドウマネージャから隠されます。

数年前、このプロジェクトのために書いたスクリプトを整理してコメントしました。正直なところ、ほとんど使用しませんが、手形に適している必要があります。

xdotools(Xを実行するだけで)使用の利点は、制御可能で調整できることです。カスタムウィンドウツールを作成するのに便利なツールです。バグや必要な機能があれば処理が簡単です。

ターミナルエミュレータを隠すことに加えて、このスクリプトにはいくつかのオプションがあります。

  • -pマッピングを解除する前に、端末と同じ座標に子を配置します。
  • -r端末を隠すのではなく、端末の子として作成します。 (非常に実験的であり、さまざまなアプリケーションで正しく機能するには、より多くの作業が必要です。)
  • -vより細かい印刷
  • -h助ける

オプションが設定されていない場合は、単にプログラムを起動してターミナルマッピングを解除します。

また、再マッピング時に端末の位置を復元します。これは、さまざまなウィンドウマネージャで失われる可能性があるためです。

広くテストされていませんが、短時間でうまく機能しました。

実行中で新しいインスタンスを作成しないアプリケーションにこれを使用する場合(たとえば)、アプリケーションが新しいセッションを開始するためにフラグまたはその他の項目(存在する場合)をqalculate使用する必要があります。-n

もちろん実装も可能です最小化する代わりに/追加マッピング解除など。

気づく!:サイト/ SEはタブのスペースを置き換えるか、[コピー]をクリックしてコードを分割するため編集するまたはエディタに貼り付けた後も続きます。 (これは<<-EOF次に適用されます)

#! /bin/sh -

# Print various information, option: -v
verbose=0
# Position spawned window at X Y of terminal, option: -p
poschild=0
# Reparent to terminal
reparent=0

# ENABLE JOB CONTROL
set -m

print_help() {
    cat<<-EOF
    Usage: $(basename "$0") [OPTION] program [args ...]
      Hide terminal window by unmapping until program exits.
      Do Ctrl+C when using -r / -p if program fails.
    OPTIONS
      -p  Position child at X Y of terminal.
      -r  Reparent. Set it as child of terminal.
      -v  Verbose. Print geometry.
      -h  This help.
    EOF
}
print_geom() {
    cat<<-EOF
    WIN-ID  $WINDOW
    POS     $X $Y
    SIZE    $WIDTH $HEIGHT
    EOF
}
# DEFINES by Evil Eval
#   WINDOW (window id)
#   X Y
#   WIDTH HEIGHT
#   SCREEN
get_win_geom() {
    eval "$(xdotool getactivewindow getwindowgeometry --shell)"
}
# RESTORE Terminal Geom
set_win_geom() {
    xdotool windowmove "$WINDOW" "$X" "$Y"
    xdotool windowsize "$WINDOW" "$WIDTH" "$HEIGHT"
}
# HIDE current terminal
term_hide() {
    xdotool windowunmap "$WINDOW"
}
# RESTORE Terminal
term_show() {
    xdotool windowmap "$WINDOW"
    # On remapping window can loose original position
    # Restore to pre-unmap values
    set_win_geom
}
# Position program at X Y of terminal
# Using -sync has two effects:
#   1. Need to wait for window to appear
#   2. If command fails it hangs, and we can
#      abort with Ctrl+C
# Use --onlyvisible as windows can have a range of sub-windows.
# This could likely be done better.
pos_child() {
    wid="$(xdotool search --sync --pid "$1" --onlyvisible --limit 1 --all)"
    xdotool windowmove "$wid" "$X" "$Y"
}
# Adopt the child process's window
win_reparent() {
    wid="$(xdotool search --sync --pid "$1" --onlyvisible --limit 1 --all)"
    xdotool windowreparent "$wid" "$WINDOW"
}
# Bring process to foreground after mapping, moving etc.
fg_cpid() {
    if ! kill -0 "$cpid" 2>/dev/null || ! fg %1 >/dev/null; then
        printf 'Failed\n' >&2
        return 1
    fi
}
while [ -n "$1" ]; do
    case "$1" in
    '-h'|--help) print_help >&2 ; exit 1 ;;
    '-v') verbose=1 ;;
    '-p') poschild=1 ;;
    '-r') reparent=1 ;;
    *) break ;;
    esac
    shift
done
get_win_geom
[ $verbose -eq 1 ] && print_geom >&2

# Order of operation can be of importance here.
# Start child before unmap
command "$@" &
cpid="$!"

[ $poschild -eq 1 ] && pos_child "$cpid"
[ $verbose -eq 1 ] && jobs -l
if [ $reparent -eq 1 ]; then
    win_reparent "$cpid"
    fg_cpid || exit 1
else
    term_hide
    fg_cpid || exit 1
    # Restore when child departs
    term_show
fi

おすすめ記事