X11

X:使用 xrandr 關閉並再次打開顯示器後,alt/ctrl/f1 不再起作用

  • December 13, 2016

(在將重要的新資訊編輯到問題中之後)

從命令行 ( xrandr --output ... --off) 關閉顯示器,然後將其轉回 ( xrandr --output ... --auto) 後,我的 X 桌面失去了切換到字元控制台的能力(即 alt/ctrl/f1 不再工作)。

其他 X 控制快捷鍵(alt/ctrl/backspace)仍然有效。

為什麼?如何重新啟用此功能?


資訊:它是 Linux Mint,最新的穩定版。在我使用 from 命令行關閉 X xrandr --output ... --off,然後在第二天早上再次打開它(使用xrandr --output ... --auto命令)之後,問題就明顯發生了。

我使用它,因為我需要在回家之前將其完全關閉,並且正常設置(控制面板中某處的能量設置)不夠或有問題。

我的鍵盤沒問題,例如正確xev顯示 alt/ctrl/f3釋放事件:

KeyRelease event, serial 37, synthetic NO, window 0x3c00001,
   root 0x2e1, subw 0x0, time 1622285717, (99,77), root:(961,532),
   state 0xc, keycode 69 (keysym 0x1008fe03, XF86Switch_VT_3), same_screen YES,
   XLookupString gives 0 bytes: 
   XFilterEvent returns: False

但是按鍵事件不在列表中。因此,xev 看不到alt/ctrl/f3 的按下,但不知何故它可以看到它的釋放。


調試輸出:

$ xmodmap -pke|grep -i xf86switch
keycode  67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1 F1 F1 XF86Switch_VT_1
keycode  68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2 F2 F2 XF86Switch_VT_2
keycode  69 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3 F3 F3 XF86Switch_VT_3
keycode  70 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4 F4 F4 XF86Switch_VT_4
keycode  71 = F5 F5 F5 F5 F5 F5 XF86Switch_VT_5 F5 F5 XF86Switch_VT_5
keycode  72 = F6 F6 F6 F6 F6 F6 XF86Switch_VT_6 F6 F6 XF86Switch_VT_6
keycode  73 = F7 F7 F7 F7 F7 F7 XF86Switch_VT_7 F7 F7 XF86Switch_VT_7
keycode  74 = F8 F8 F8 F8 F8 F8 XF86Switch_VT_8 F8 F8 XF86Switch_VT_8
keycode  75 = F9 F9 F9 F9 F9 F9 XF86Switch_VT_9 F9 F9 XF86Switch_VT_9
keycode  76 = F10 F10 F10 F10 F10 F10 XF86Switch_VT_10 F10 F10 XF86Switch_VT_10
keycode  95 = F11 F11 F11 F11 F11 F11 XF86Switch_VT_11 F11 F11 XF86Switch_VT_11
keycode  96 = F12 F12 F12 F12 F12 F12 XF86Switch_VT_12 F12 F12 XF86Switch_VT_12

該命令xmodmap -pke | grep ' F[0-9]\+'給出完全相同的結果。


附加資訊:切換到角色控制台的功能在斷電時失去,而不是在通電時(因此,我必須從手機 ssh 進入我的工作站才能輸入xrandr --output ... --auto命令)。


腳本測試:我已經嘗試過@GeorgeVasilou 的腳本,它通過注入 X11 事件來模擬鍵盤敲擊。結果是否定的,模擬的 alt/ctrl/f1 序列僅顯示為單個H.

這是一個擴展評論,而不是答案。

在我的系統中,Ctrl++Alt正常F1工作,我得到一個 KeyPress 事件,用於controland alt,但沒有用於F1. 雖然我知道它可以工作,因為我被轉移到 tty1。

這是xev我的完整輸出(僅供比較):

root@debi64:/home/gv/Desktop/PythonTests# xev -event keyboard
Outer window is 0x4400001, inner window is 0x4400002

KeymapNotify event, serial 18, synthetic NO, window 0x0,
   keys:  4294967192 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
          0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyPress event, serial 25, synthetic NO, window 0x4400001,
   root 0x281, subw 0x0, time 11550957, (157,186), root:(748,462),
   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 28, synthetic NO, window 0x4400001,
   root 0x281, subw 0x0, time 11550960, (157,186), root:(748,462),
   state 0x8, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
   XLookupString gives 0 bytes: 
   XmbLookupString gives 0 bytes: 
   XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x4400001,
   root 0x281, subw 0x0, time 11553775, (157,186), root:(748,462),
   state 0xc, keycode 67 (keysym 0x1008fe01, XF86Switch_VT_1), same_screen YES,
   XLookupString gives 0 bytes: 
   XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x4400001,
   root 0x281, subw 0x0, time 11553902, (157,186), root:(748,462),
   state 0xc, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
   XLookupString gives 0 bytes: 
   XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x4400001,
   root 0x281, subw 0x0, time 11553902, (157,186), root:(748,462),
   state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
   XLookupString gives 0 bytes: 
   XFilterEvent returns: False

KeymapNotify event, serial 28, synthetic NO, window 0x0,
   keys:  4294967169 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
          0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

ClientMessage event, serial 28, synthetic YES, window 0x4400001,
   message_type 0x11b (WM_PROTOCOLS), format 32, message 0x119 (WM_DELETE_WINDOW)

Ctrl我還創建了一個模擬++alt按鍵的小型 python 腳本F1。當我執行腳本時,我也毫無問題地轉移到 tty1 中。

你甚至可以嘗試在你的機器上執行這個腳本,看看你是否去 tty1,作為一個雙重檢查/驗證你的鍵盤工作正常:

https://github.com/gevasiliou/PythonTests/blob/master/pykey-test.py

PS:除了腳本,您還可以嘗試執行#chvt 1應該將您也轉移到 tty1。

經過一些研究,其他使用者報告說Ctrl+ alt+fn鍵由於 xserver 更新(顯然)而停止工作,這修改了一些適用於 tty 的解析度設置。

例如,在這篇文章中,問題已通過在引導期間應用特定的 vga 解析度作為核心參數 (vga=mode) 得到解決,例如 vga=0x0362。顯然,其中一個系統更新搞砸了這些人的解決方案,所以也許這也是你的情況(只有上帝知道為什麼)。

PS:要查看您的系統可用的支持模式,您需要執行hwinfo --framebuffer | grep 'Mode'並從將列出的模式中選擇一種模式。

順便說一句,您F3在問題中包含了 xev 的某些部分,但是輸出是F1什麼?

更新:

作為進一步的故障排除,值得嘗試以下一些:

  1. 查看xrandr 原始碼似乎 –off 選項執行以下命令:
set_name_xid (&config_output->mode, None);
set_name_xid (&config_output->crtc, None);
config_output->changes |= changes_mode | changes_crtc;

您可以嘗試通過指定 –mode 和 –crtc xrandr 選項而不是 –auto 來重新啟用 –output(以防 xrandr“自動化”無法正常工作)。

  1. 在這個關於控制台的核心文件中,您可以看到目錄下執行虛擬控制台的驅動程序/支持的模組有哪些 /sys/class/vtconsole

您可以在開機期間和關機後比較所有文件/模組的值,以確定您有不同的行為。也許有些東西正在-off時間修改這些值。

這是我的系統的列印輸出,其中切換到 tty1-2-3-4-5-6 可以正常工作:

root@debi64:/home/gv/Desktop/PythonTests# for f in $(find /sys/class/vtconsole/vtcon0/ -type f);do echo -e "File : $f \c\c\c";echo -e "-VALUE : \c";cat $f;done
File : /sys/class/vtconsole/vtcon0/bind -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/runtime_active_kids -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/runtime_suspended_time -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/autosuspend_delay_ms -VALUE : cat: /sys/class/vtconsole/vtcon0/power/autosuspend_delay_ms: Input/output error
File : /sys/class/vtconsole/vtcon0/power/runtime_enabled -VALUE : disabled
File : /sys/class/vtconsole/vtcon0/power/runtime_active_time -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/control -VALUE : auto
File : /sys/class/vtconsole/vtcon0/power/async -VALUE : disabled
File : /sys/class/vtconsole/vtcon0/power/runtime_usage -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/runtime_status -VALUE : unsupported
File : /sys/class/vtconsole/vtcon0/uevent -VALUE : 
File : /sys/class/vtconsole/vtcon0/name -VALUE : (S) VGA+
root@debi64:/home/gv/Desktop/PythonTests# for f in $(find /sys/class/vtconsole/vtcon1/ -type f);do echo -e "File : $f \c\c\c";echo -e "-VALUE : \c";cat $f;done
File : /sys/class/vtconsole/vtcon1/bind -VALUE : 1
File : /sys/class/vtconsole/vtcon1/power/runtime_active_kids -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/runtime_suspended_time -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/autosuspend_delay_ms -VALUE : cat: /sys/class/vtconsole/vtcon1/power/autosuspend_delay_ms: Input/output error
File : /sys/class/vtconsole/vtcon1/power/runtime_enabled -VALUE : disabled
File : /sys/class/vtconsole/vtcon1/power/runtime_active_time -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/control -VALUE : auto
File : /sys/class/vtconsole/vtcon1/power/async -VALUE : disabled
File : /sys/class/vtconsole/vtcon1/power/runtime_usage -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/runtime_status -VALUE : unsupported
File : /sys/class/vtconsole/vtcon1/uevent -VALUE : 
File : /sys/class/vtconsole/vtcon1/name -VALUE : (M) frame buffer device
  1. 最後,可能值得研究可能的自動節能功能,例如 Xserver DPMS設置,這些功能可以在長時間不活動時自動啟動。

第二次更新:

環顧四周,我發現可以通過命令控制虛擬終端上的 DPMS 和其他有用的節能相關設置setterm。如果您的虛擬終端似乎正在休眠,您可以嘗試通過向它們發送setterm --reset命令來喚醒它們(如果是這種情況)。要將命令從您的正常 tty7 發送到另一個 tty,您需要使用: setsid bash -c 'exec setterm --reset <> /dev/tty1 >&0 2>&1'

唯一的問題是您必須在 tty1 登錄。

對於測試,您可以使用 setsid bash -c 'exec setterm --reverse on <> /dev/tty1 >&0 2>&1'並且當您的 tty1 工作時,如果您切換到它,chvt 1您可以觀察結果(在終端中交換顏色時反轉 - 在 Debian 中測試和工作)。

此外,setterm 為您提供了啟用/禁用 powersave 的選項setterm --powersave off,還有更多(請參閱man setterm

引用自:https://unix.stackexchange.com/questions/328078