2011-03-03

【Scripts】CapsLock Notification on Debian

自從得知 ThinkPad T410 的大寫鍵 Caps Lock 狀態燈離開螢幕下方的 LED 面板的以後,凍仁就一直很依賴右下角的通知(Notification),不是說新的設計不好,但用久了就會發現它早就被左手的小拇指遮住,哪還看得到什麼 LED ..!? 雖說官方早已幫 Windows 寫好 On-screen display(OSD),而 Mac OSX 上也有 CapSee,至於 Linux 上凍仁有找到 lock-keys-applet,但還是不像官方的直覺。


安裝 notification 相關套件

凍仁是透過 notification-daemon 發送訊息來辨別當前的狀態,在開始之前得先安裝發送自訂訊息的套件。
jonny@squeeze:~$ sudo aptitude install libnotify-bin [Enter]

程式主體

Google 半天才找到可以透過 xset 來查詢 LED 狀態。
jonny@squeeze:~$ xset -q [Enter]
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000002
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    on     02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off

來加工一下唄!
jonny@squeeze:src$ vi capslock_notification.sh [Enter]
 1 #!/bin/bash
 2 # 用 notify-send 送出訊息時,在不加入單引號以及雙引號的情況下,空格會被當作換行處理 。
 3 # Icon 路徑請自行更改。
 4 
 5 if [ $( xset q | grep Caps | awk '{ print $4 }' ) = off ]; then
 6     STATUS="'Lock keys' 'Caps-Lock has been disabled'";
 7     echo "notify-send -t '2000' -i $HOME/.icons/lock-keys/capslock_off.png  $STATUS" | bash
 8 else
 9     STATUS="'Lock keys' 'Caps-Lock has been enabled'";
10     echo "notify-send -t '2000' -i $HOME/.icons/lock-keys/capslock_on.png  $STATUS" | bash
11 fi

設定 CapsLock 傾聽

方法一:Compiz

Command Line:
1. 開啟 CompizConfig Settings Manager
jonny@squeeze:~$ ccsm & [Enter]

2. 新增傾聽 Caps Lock 事件。
jonny@squeeze:~$ vi $HOME/.config/compiz/compizconfig/Default.ini [Enter]
......
[commands]
......
as_command1 = /usr/local/bin/capslock.sh
as_run_command1_key = Caps_Lock

圖形化設定:
1. 開啟 應用程式選單 → 系統 → 偏好設定 → CompizConfig Settings Manager

2. 點選自訂指令

3. 輸入程式路徑

4. 自訂啟動熱鍵

5. 設定啟動鍵

方法二:gnome-keybinding-properties

基於不是每台 Debian 都會裝 Compiz,補上 Gnome 內建的鍵盤捷徑鍵(Keyboard Shortcuts)手動編輯設定檔方法,GUI 無法直接抓取 Caps Lock 事件。

1. 開啟 應用程式選單 → 系統 → 偏好設定 → 鍵盤捷徑鍵(Keyboard Shortcuts)
2. 新增 Caps Lock 熱鍵

3. 命名並指定路徑

4. 隨便自訂事件,事後再修改
# 註:事件觸發後才會產生新設定檔!

5. 編輯設定檔
jonny@squeeze:~$ vi $home/.gconf/desktop/gnome/keybindings/custom5/%gconf.xml [Enter]
 1 <?xml version="1.0"?>
 2 <gconf>
 3     <entry name="action" mtime="1299259480" type="string">
 4         <stringvalue>/home/jonny/bin/capslock-notify</stringvalue>
 5     </entry>
 6     <entry name="name" mtime="1299259480" type="string">
 7         <stringvalue>CapsLock</stringvalue>
 8     </entry>
 9     <entry name="binding" mtime="1299235446" type="string">
10         <stringvalue><Alt>grave</stringvalue>
10         <stringvalue>Caps_Lock</stringvalue>
11     </entry>
12 </gconf>

6. 修改完會發現 Shortcuts 被 Disabled

7. 重新啟動 X Windows
jonny@squeeze:~$ sudo /etc/init.d/gdm3 restart [Enter]

8. 完成

成果展示

Caps-Lock ON

Caps-Lock OFF

註:上圖中的通知圖示皆從 Windows 上的 OSD 擷取,應該不可散佈

資料來源:
hardy.dropblog › Trying to detect the state of the caps-lock key in X
用Nofity OSD通知指令工作執行結束 « WMの物語
I am LAZY bones ? : xchat的提醒方式蛮丰富的

8 則留言 :

  1. 這個在 PC上也有用嗎?還是有限 NB 及機型?

    回覆刪除
  2. 您只要先用 xset -q 看看有沒有像凍仁那樣的結果,如果一樣了話就 ok!

    有機會在找 PC 測試了,畢竟現在手邊只有小黑 XDD

    回覆刪除
  3. notify-send 的 -t 參數 (expire time) 不是失效了嗎? -t 2000 有用嗎?
    我的 Ubuntu 10.10 跟之前的 10.04 都是沒有用的。

    回覆刪除
  4. 在下在 Debian Squeeze 上可以很明顯的感覺出來有差別,ubuntu 的部份手邊只有 11.04,晚點有空重開再測囉 xd

    回覆刪除
  5. sleep 2000 ; notify-send -i $HOME/.icons/lock-keys/capslock_off.png "$STATUS"

    沒有 -t 就用 sleep

    回覆刪除
  6. Dear:hepha

    -t 指的是訊息 show 的延遲時間,而不是過了幾秒才顯示出來唷!

    凍仁會想要即時訊息,但又不希望他 show 太久!

    回覆刪除
  7. Ubuntu 11.04 現在已經有 indicator-keylock 可以用囉!!

    回覆刪除

謝謝您的寶貴意見,凍仁一定會盡快處理 ~^^