ALT_RENTER+를 사용하여 기능을 수행하는 응용 프로그램이 있습니다 . Xmonad에서 이 응용 프로그램을 사용할 때 Mod1+ 조합은 ENTER"현재 창을 기본 창으로 바꾸기" 기능을 트리거합니다. 기본적으로 ALT_L및 ALT_R에 매핑됩니다 Mod1.
내에서는 Xmonad를 시작하기 전에 정의의 일부 가 아닌 .xinitrc
키맵을 변경했습니다 . 그럼에도 불구하고 Xmonad는 +가 입력될 때 여전히 창 교환 동작을 수행합니다 . Xmonad는 그것이 더 이상 포함되지 않는다는 사실을 모르는 것 같습니다 .xmodmap
ALT_RMod1ALT_RENTERMod1ALT_R
이 내 꺼야.xinitrc
# Java's GUI can't handle some non-reparenting window managers like
# Xmonad without being told how to behave
export _JAVA_AWT_WM_NONREPARENTING=1
# The right Alt key is useful in IntelliJ, tell Xmonad to ignore it
xmodmap ~/.Xmodmap
# Start Xmonad
xmonad
xmodmap
이것은 Xmonad가 시작된 후의 출력입니다.
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
시퀀스를 기록했으며 xev
해당 ENTER시퀀스가 등록된 적이 없음을 확인했습니다. 대신 녹화 후 여러 FocusIn
/ FocusOut
이벤트 가 발생합니다.ALT_R
KeyPress event, serial 32, synthetic NO, window 0x1200001,
root 0xc0, subw 0x0, time 1432589, (92,374), root:(93,375),
state 0x0, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
FocusOut event, serial 32, synthetic NO, window 0x1200001,
mode NotifyGrab, detail NotifyAncestor
PropertyNotify event, serial 32, synthetic NO, window 0x1200001,
atom 0x155 (WM_STATE), time 1433760, state PropertyNewValue
FocusOut event, serial 32, synthetic NO, window 0x1200001,
mode NotifyUngrab, detail NotifyPointer
FocusIn event, serial 32, synthetic NO, window 0x1200001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 32, synthetic NO, window 0x0,
keys: 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
KeyRelease event, serial 32, synthetic NO, window 0x1200001,
root 0xc0, subw 0x0, time 1434117, (92,374), root:(93,375),
state 0x8, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
또 다른 흥미로운 관찰은 각 키 이벤트 xev
가 눌려졌는지 또는 눌려졌는지에 관계없이 8로 보고된다는 것입니다. 상수는 8로 정의됩니다. 다음 순서는 + 다음 + 입니다.state
ALT_LALT_RMod1Mask
/usr/include/X11/X.h
ALT_LfALT_Rf
KeyPress event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4126632, (85,488), root:(86,489),
state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4126850, (85,488), root:(86,489),
state 0x8, keycode 41 (keysym 0x66, f), same_screen YES,
XLookupString gives 1 bytes: (66) "f"
XmbLookupString gives 1 bytes: (66) "f"
XFilterEvent returns: False
KeyRelease event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4126930, (85,488), root:(86,489),
state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4126969, (85,488), root:(86,489),
state 0x0, keycode 41 (keysym 0x66, f), same_screen YES,
XLookupString gives 1 bytes: (66) "f"
XFilterEvent returns: False
KeyPress event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4127907, (85,488), root:(86,489),
state 0x0, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4128123, (85,488), root:(86,489),
state 0x8, keycode 41 (keysym 0x66, f), same_screen YES,
XLookupString gives 1 bytes: (66) "f"
XmbLookupString gives 1 bytes: (66) "f"
XFilterEvent returns: False
KeyRelease event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4128164, (85,488), root:(86,489),
state 0x8, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 32, synthetic NO, window 0x1000001,
root 0xc0, subw 0x0, time 4128203, (85,488), root:(86,489),
state 0x0, keycode 41 (keysym 0x66, f), same_screen YES,
XLookupString gives 1 bytes: (66) "f"
XFilterEvent returns: False
이제 질문은 xmodmask
그렇지 않다고 말하면 ALT_R보고서 + 가 mod1왜 그렇게 보이는가 하는 것입니다.X
ALT_Rf
답변1
Xmonad는 다른 수정자 마스크를 사용하는 경우에만 이 작업을 수행할 수 있습니다. 소스 코드에는 특별한 경우가 언급되어 있습니다. 예를 들면 다음과 같습니다.
-- modMask lets you specify which modkey you want to use. The default
-- is mod1Mask ("left alt"). You may also consider using mod3Mask
-- ("right alt"), which does not conflict with emacs keybindings. The
-- "windows key" is usually mod4Mask.
--
myModMask = mod1Mask
추천둘수정자 마스크(X에는 미리 정의된 키 수정자가 포함되어 있지 않기 때문)alt
(또는meta
) 열쇠. 여기에는 다음이 포함됩니다옮기다,잠그다,제어— 및 지정되지 않은 수정자 키 5개. Xmonad는 (소스 코드 읽기) Shift 및 Lock 외에 이러한 키에 대해 특별한 것을 알지 못합니다.
그래서 할당해야합니다Alt_L
그리고Alt_R
Xmonad에서 다른 용도로 사용하려면 수정자 마스크를 분리하세요.
답변2
+가 Xmonad
+로 처리되는 이유는 질문의 출력에 표시된 대로 필드의 비트가 설정되기 때문입니다. 누르라고 되어 있기 때문에 어떤 키를 누르고 있는지 알 수 없습니다.ALT_RENTERmod1ENTERX
mod1Mask
state
KeyEvent
xev
Xmonad
ALT_RX
ENTERstate = mod1Mask
X
무례한 이유는 xmodmap
여기에서 묻는 별도의 질문입니다.
X가 ALT_L 및 ALT_R을 Mod1과 다르게 처리하지 않는 이유