2010年10月13日 星期三

Ubuntu切換外接video的hotkey作法

首先evdev driver必須從kernel input event得到正確的keycode,在/usr/include/linux/input.h定義為:
#define KEY_SWITCHVIDEOMODE     227


然後在xkb-data套件中定義了kernel keycode到X keycode的mapping:在/usr/share/X11/xkb/keycodes/evdev裡:
<I235> = 235;   // #define KEY_SWITCHVIDEOMODE     227


在/usr/share/X11/xkb/symbols/inet裡:
key <I235>   {      [ XF86Display           ]       };


於是當切換外接video的hotkey按下後,也就是scancode產生時,kernel input event會產生出值為227的keycode,evdev讀到之後,Xserver再依據xkbdata的設定轉換為XF86Display。

接下來gnome-settings-daemon會filter這個X key,如gnome-settings-daemon-2.32.0/plugins/xrandr/gsd-xrandr-manager.c:

if (xev->xany.type == KeyPress) {
if (xev->xkey.keycode == manager->priv->switch_video_mode_keycode)
handle_fn_f7 (manager, xev->xkey.time);
else if (xev->xkey.keycode == manager->priv->rotate_windows_keycode)
handle_rotate_windows (manager, xev->xkey.time);


g-s-d每收到一個XF86Display key時,會呼叫gnome-rr-* 相關的函式(請見libgnomeui/gnome-rr.h),透過RandR API切換螢幕顯示的設定,便會切換到如外接投影機等顯示設備。

參考:http://live.gnome.org/RandR

沒有留言: