gnome-keybinding-propertiesで表示されているショートカットは gconfのエントリによって処理しているプロセスが2つに分かれます。 ●gnome-settings-daemonで処理されるもの 下記の2つのエントリに記述されているショートカット ・/apps/gnome_settings_daemon/keybindings ・/desktop/gnome/keybindings/
●metacityで処理されるもの ・/apps/metacity/global_keybindings(ショートカットキー) (/apps/metacity/keybinding_commandsはそのコマンド) ・/apps/metacity/window_keybindings(ショートカットキー) (実行される内容はソースコードに定義)
デフォルトの[ウィンドウのスクリーンショットを撮る]に割当てられている<Alt>Printは動作します。 <Alt>Excuteになっても動きます。これはmetacityで処理されているためです。
カスタムショートカットは"/desktop/gnome/keybindings/"の下に作成されるので gnome-settings-daemonが処理します。
修正すべき箇所は2箇所ありました。
a) Gconfのエントリを解析する部分 b) キー入力イベントのコールバックでキーの照合をする部分
上記のほかに、きちんと直すのであればMappingNotifyイベントが発生した場合に 内部データに持っているキーコードをGconfのエントリから作り直す必要があります。 (本当にパッチを書くのであれば必須であること思っています。)
まず、a)の方ですが plugins/common/eggaccelerators.c の egg_accelerator_parse_virtual関数で Gconfのエントリから取得した"<Alt>Execute"の"Execute"の部分を gdk_keyval_from_nameに渡し、その戻りをgdk_keymap_get_entries_for_keyvalに渡してkeycodeを得ています。 このときgdk_keymap_get_entries_for_keyvalが返すGdkKeymapのうちメンバlevelの値が0のものだけを使用しています。 "Excute"の場合は帰ってくるGdkKeymapKeyが1つだけで、そのlevelが1であるためegg_accelerator_parse_virtualが エラーを返します。その結果 「** (gnome-settings-daemon:2375): WARNING **: キー・バインディング (custom0) が無効です」 が出力されます。 metacityでは処理の仕方が違うのですが、"<Alt>Excute"をはじくことはありません。 GdkKeymap.levelの意味するところを理解していないのですが、当該のチェックをはずすしました。
次に、b)の方 plugins/common/gsd-keygrab.c の match_key関数を修正しました。 ここではXEvent.xkeyをgdk_keymap_translate_keyboard_state関数でkeysymに変更してから 内部データと比較しています。 ただし、gdk_keymap_translate_keyboard_state関数が失敗するとkeycodeによる比較を行います。
下記にあるように"Print"と"Excute"はkeycodeが同一ですが、keysymは異なります。 metacityがkeycodeとstateによる比較を行っているので同じようkeycodeとstateを使用するようにしました。 (ただし本当はキーマップが変更された場合に備えてMappingNotifyで内部データを作り直さなければならない)
・Keycodeとkeysiy(xevの出力) 2つともKeycodeは同じで 十進表記で 107 すが、 Keysymは16進でPrint:ff61 , Exucute:ff62
[Print]を押した場合 state 0x10, keycode 107 (keysym 0xff61, Print), same_screen YES,
[Alt+Print]を押した場合 state 0x18, keycode 107 (keysym 0xff62, Execute), same_screen YES,
gnome-keybindin g-propertiesで表示 されているショートカットは 理しているプロセスが2つに分か れます。 settings- daemonで処理されるもの ているショートカット gnome_settings_ daemon/ keybindings gnome/keybindin gs/
gconfのエントリによって処
●gnome-
下記の2つのエントリに記述され
・/apps/
・/desktop/
●metacityで処理されるもの metacity/ global_ keybindings( ショートカットキー) metacity/ keybinding_ commandsはそのコマンド ) metacity/ window_ keybindings( ショートカットキー) ードに定義)
・/apps/
(/apps/
・/apps/
(実行される内容はソースコ
デフォルトの[ ウィンドウのスクリーンショット を撮る]に割当てられている< Alt>Printは動作します 。 も動きます。これはmetaci tyで処理されているためです。
<Alt>Excuteになって
カスタムショートカットは" /desktop/ gnome/keybindin gs/"の下に作成されるので daemonが処理します。
gnome-settings-
修正すべき箇所は2箇所ありました。
a) Gconfのエントリを解析する部分 でキーの照合をする部分
b) キー入力イベントのコールバック
上記のほかに、 きちんと直すのであればMapp ingNotifyイベントが発 生した場合に ドをGconfのエントリから作 り直す必要があります。 必須であること思っています。 )
内部データに持っているキーコー
(本当にパッチを書くのであれば
まず、a)の方ですが common/ eggaccelerators .c の egg_accelerator _parse_ virtual関数で た"<Alt> Execute" の"Execute" の部分を from_nameに渡し、 その戻りをgdk_ keymap_ get_entries_ for_keyvalに渡してk eycodeを得ています。 keymap_ get_entries_ for_keyvalが返すGd kKeymapのうちメンバle velの値が0のものだけを使用 しています。 の場合は帰ってくるGdkKey mapKeyが1つだけで、 そのlevelが1であるためe gg_accelerator_ parse_virtualが settings- daemon: 2375): WARNING **: キー・バインディング (custom0) が無効です」 が違うのですが、 "<Alt>Excute" をはじくことはありません。 levelの意味するところを理 解していないのですが、 当該のチェックをはずすしました 。
plugins/
Gconfのエントリから取得し
gdk_keyval_
このときgdk_
"Excute"
エラーを返します。その結果
「** (gnome-
が出力されます。
metacityでは処理の仕方
GdkKeymap.
次に、b)の方 common/ gsd-keygrab. c の match_key関数を修正しました。 xkeyをgdk_ keymap_ translate_ keyboard_ state関数でkeysymに 変更してから keymap_ translate_ keyboard_ state関数が失敗するとke ycodeによる比較を行います 。
plugins/
ここではXEvent.
内部データと比較しています。
ただし、gdk_
下記にあるように" Print"と" Excute" はkeycodeが同一ですが、 keysymは異なります。 eとstateによる比較を行っ ているので同じようkeycod eとstateを使用するように しました。 された場合に備えてMappin gNotifyで内部データを作 り直さなければならない)
metacityがkeycod
(ただし本当はキーマップが変更
・Keycodeとkeysiy (xevの出力) t:ff61 , Exucute:ff62
2つともKeycodeは同じで 十進表記で 107 すが、
Keysymは16進でPrin
[Print]を押した場合
state 0x10, keycode 107 (keysym 0xff61, Print), same_screen YES,
[Alt+Print]を押した場合
state 0x18, keycode 107 (keysym 0xff62, Execute), same_screen YES,