잠자기 후 xmodmap이 손실됨

잠자기 후 xmodmap이 손실됨

Ubuntu 18.04에서는 다음 자동 시작 스크립트를 사용합니다.

[Desktop Entry]
Type=Application
Exec=/home/user/.xinitrc
Version=1.0
X-GNOME-Autostart-enabled=true
Name=xmodmap
Comment=xmodmap script

이것은 단지 입니다 xmodmap /path/.Xmodmap &.

시스템이 부팅되면 작동합니다. 시스템이 절전 모드에서 깨어나면 다시 매핑이 더 이상 작동하지 않습니다. 이 문제를 어떻게 해결할 수 있나요?

편집: (댓글에 대한 답변) 이렇게 해도 문제가 해결되지 않습니다.

$ cat /etc/systemd/system/xmodmapbindings.service
[Unit]
Description=xmodmap bindings
Before=sleep.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=-/home/norake/.xinitrc

[Install]
WantedBy=sleep.target

$ cat ~/.xinitrc 
#!/bin/bash

if [ "$USER" != norake ]; then
    su norake -c 'sleep 5; /usr/bin/xmodmap /home/norake/.Xmodmap' &
    # without su, without sleep, without fork (&): doesn't work either
else
    (sleep 5; /usr/bin/xmodmap /home/norake/.Xmodmap) &
fi

sleep 30아니요. 물론 스크립트를 수동으로 실행하면 작동합니다.

답변1

키보드를 분리했다가 다시 연결하면 수정된 설정도 "손실"됩니다. 이는 여기서 발생합니다. 일시 중지에 들어가면 키보드가 비활성화되고 활성화를 종료하면 다시 연결되므로 일시 중지는 핫플러그 이벤트를 생성합니다.

X 서버의 관점에서 보면 일시정지 상태에서 복귀한 후 연결된 키보드는 새로운 키보드이므로 두 번째 키보드와 마찬가지로 표준 바인딩으로 시작된다.

이는 USB 키보드 드라이버의 알려진 단점이며 커널에서 수정하기 어렵습니다(USB는 복구 시 다시 열거되므로 새 번호가 할당되더라도 장치의 ID를 유지할 수 있는 방법이 필요함). X 서버에서 수정하기가 어렵습니다(장치의 기록을 보존해야 하기 때문입니다).

당신이 할 수 있는 최선의 방법은 아마도 세션 시작의 일부와 키보드 핫플러그 처리의 일부로 명령을 실행하는 것이지만 여기서는 완전히 깨끗한 솔루션을 생각할 수 없습니다.

답변2

이 문제의 특별한 경우에 대한 저기술 해키 솔루션은 다음과 같습니다.

내 키보드에는 메뉴 키가 있어야 할 곳에 인쇄 키가 있으므로 xmodmap은 해당 키만 다시 매핑합니다.

실행하려는 인쇄 키에 대한 키 바인딩을 설정했습니다(제 경우에는 그놈 쉘에서).

/bin/bash -c "/usr/bin/xmodmap $HOME/.Xmodmap"

따라서 일시 중지 후 처음으로 Print 키를 누르면 xmodmap이 트리거되고 그 이후부터 메뉴 키 역할을 합니다.

(내 키보드에는 더 이상 인쇄 키가 없습니다.)

이 접근 방식은 다음과 같은 상황에서 작동해야 합니다.

  1. 처음에 "블라인드" 키를 누르는 것은 신경 쓰지 않습니다.
  2. 재매핑이 관련되기 전이나 재매핑이 관련되게 되자마자 누를 버튼이 하나 이상 있습니다.
  3. 버튼의 원래 키 기호는 더 이상 새 매핑에 표시되지 않습니다.

고쳐 쓰다: 이후 초기 리바인딩 단계에서 컨텍스트 메뉴 자체가 트리거되도록 xdotool을 사용하여 솔루션을 개선했습니다.

/bin/bash -c "xdotool keyup Print key --clearmodifiers Menu && /usr/bin/xmodmap $HOME/.Xmodmap"

답변3

$USER실제 사용자 이름으로 바꿔야 합니다 .

  1. .Xmodmap내 경우에는 매핑을 사용하여 파일을 생성합니다 .

    keycode 96 = XF86AudioLowerVolume
    keycode 95 = XF86AudioMute
    keycode 76 = XF86AudioNext
    keycode 75 = XF86AudioPlay
    keycode 74 = XF86AudioPrev
    

    그리고 그것을 /home/$USER/.Xmodmap경로 아래에 두십시오.

  2. 응용 프로그램 시작 기본 설정을 만들고(참 검색 메뉴에서 응용 프로그램 시작 기본 설정으로 이동) 다음을 추가합니다.

    Name: xmodmap
    Command: /bin/bash -c "sleep 7 && xmodmap ~/.Xmodmap"
    Comment: 
    

    그리고 저장하세요. 시작 응용 프로그램 기본 설정을 끄세요.

  3. 이제 /usr/lib/systemd/system-sleep아래와 같이 폴더로 이동합니다.

    cd /usr/lib/systemd/system-sleep
    
  4. 다음을 수행 xkeyboard.sh할 수 있습니다(sudo 권한 필요).

    sudo touch xkeyboard.sh
    
  5. 이제 $XAUTHORITY변수 값을 얻으십시오. 다음을 수행할 수 있습니다.

    echo $XAUTHORITY
    

    내 경우에는 다음을 반환했습니다.

    /run/user/1000/gdm/Xauthority
    

    어딘가에 적어 두세요.

  6. 편집을 위해 새로 생성된 파일을 열려면 다음을 수행할 수 있습니다.

    sudo nano xkeyboard.sh
    
  7. 이 코드를 붙여넣으세요. 이전에 기록해 둔 $USER사용자 이름과 $XAUTH변수 로 바꿔야 합니다 .

    #!/bin/bash
    
    echo "Running xkeyboard.sh with argument: $1" >> /tmp/xkeyboard.log
    
    if [ "${1}" == "pre" ]; then
        echo "pre" >> /tmp/xkeyboard.log
        # Nothing to do for pre-sleep
    elif [ "${1}" == "post" ]; then
        echo "post" >> /tmp/xkeyboard.log
        export DISPLAY=:0  # Set the DISPLAY variable
        export XAUTHORITY=$XAUTH
        /bin/bash -c "sleep 7 && xmodmap home/$USER/.Xmodmap" >> /tmp/xkeyboard.log 2>&1
    fi
    

    이 코드에서는 파일에 로깅을 추가했습니다. /tmp/xkeyboard.log따라서 키맵이 작동하지 않으면 그곳으로 가서 무엇이 잘못되었는지 확인할 수 있습니다.

답변4

이것은 다양한 소스의 도움을 받아 작동하는 솔루션이지만 대부분은 제가 작성했습니다. caps는 xmodmap 스크립트입니다(CapsLock => F13).

#!/bin/bash

USERN=cemkalyoncu
SCRIPT=/home/cemkalyoncu/Installed/caps

case $1 in
    post)
        DISPLAY=:0
        export DISPLAY
        su $USERN -c "$SCRIPT"
        #screen
        #su $USERN -c "sleep 30; kwin --replace &" &
    esac

kwin이 때때로 결함을 일으키고 재설정이 필요하기 때문에 나 또한 떠났습니다 kwin --replace. 그러나 그것은 데몬이 아니며 화면 분리를 사용해야 합니다. 이는 KDE를 사용하는 경우에만 해당됩니다. 설치되어 있지 않은 경우 설치 화면. 여기에서 디스플레이를 내보내는 것이 제대로 작동하도록 만드는 데 중요합니다. 사용자와 함께 실행하는 것도 필요합니다. 계정이 먼저 복원되더라도 여전히 귀하의 계정이 아닙니다. xmodmap에는 절전 모드가 필요하지 않습니다. 그러나 kwin은 재개 후 몇 초 후에 시스템에 의해 자동으로 재설정되지만 때로는 실패하므로 지연이 필요합니다.

관련 정보