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

답변2

쉘은 Zarathura와 같은 프로세스를 생성합니다하위 프로세스부모 프로세스가 종료될 때에도 종료됩니다. 터미널 에뮬레이터는 셸 자체를 하위 프로세스로 시작합니다.

따라서 가장 간단한 해결책은아니요자식 프로세스에서 항목을 열지만 별도의 프로세스로 엽니다.

당신은 이것을 할 수 있습니다어느프로세스 사용

 nohup programname parameters..

그러나 귀하의 경우에는 더 쉽습니다.

 xdg-open yourfile.pdf

application/pdf 파일을 열어야 하는 애플리케이션을 별도의 프로세스로 엽니다. 이는 다른 파일 형식에도 적용됩니다.

답변3

제가 무슨 말을 하는지 이해한 것 같으니 이 주제를 마무리하는 것을 고려해 보겠습니다. 좀 엉뚱한 느낌이 들긴 했지만 한동안 찾을 수가 없었고, 질문도 제가 물어본 것보다 더 많았습니다. 우연히 나중에 아주 빨리 찾았어요.

하지만 도움을 주셔서 감사합니다!

(관심 있으신 분들은https://www.youtube.com/watch?v=mBNLzHcUtTo영상 이름이 촌스럽네요 죄송합니다. )

건배.

관련 정보