Gnomeデスクトップ環境でカスタムショートカットに割当てたAlt+Printが動作しない

Bug #543285 reported by midspeclowload
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Ubuntu Japanese Kaizen Project
Triaged
Low
Unassigned

Bug Description

問題を確認したUbuntuのバージョン
$ lsb_release -rd
Description: Ubuntu 10.04 LTS
Release: 10.04

問題の発生しているパッケージ
$ apt-cache policy gnome-settings-daemon
gnome-settings-daemon:
  インストールされているバージョン: 2.30.1-0ubuntu1
  候補: 2.30.1-0ubuntu1
  バージョンテーブル:
 *** 2.30.1-0ubuntu1 0
        500 http://ftp.riken.jp/Linux/ubuntu/ lucid-updates/main Packages
        100 /var/lib/dpkg/status
     2.30.0-0ubuntu6 0
        500 http://ftp.riken.jp/Linux/ubuntu/ lucid/main Packages

再現手順
1.Alt+F2を押してgnome-keybinding-propertiesと入力し、Enterキーを押す。
2.分類[デスクトップ]にある[ウィンドウのスクリーンショットを撮る]の2列めをクリックし、Ctrl+Printを押下してショートカットキーを変更する。
(この時、BackSpaceを押下して無効にすると別のバグに遭遇するので注意)
3.画面下部にある[追加]ボタンをクリックして、適当な名前とコマンドを設定する
(とりあえずわかりやすいように両方geidtに設定。実際に割り当てたいのはscrotです。)
4.追加された行の2列目をクリックしてAlt+Printを押下する。ショートカットの欄には<Alt>Executeと表示される。
  このとき~/.xsession-errorsに
  「** (gnome-settings-daemon:2375): WARNING **: キー・バインディング (custom0) が無効です」
  と出力される。
5.gnome-keybinding-propertiesを終了する
6.Alt+Printを押下する。

・「期待する挙動」(Expected result)
  geditが起動する
・「実際の挙動」(Actual result)
  geditが起動しない

Revision history for this message
midspeclowload (midspeclowload) wrote :

使用しているキーボードと設定に関する記述が抜けていました。
#542698とおなじ109キーボードです。
設定は
「レイアウト」:日本
「キーボードの型式」:Generic 105-key (Intl) PC
http://lh3.ggpht.com/__HmVmS9skc8/S6XuXw6O0EI/AAAAAAAAAZ0/iTyJ8RFtbGg/kebord-setting.png

Revision history for this message
midspeclowload (midspeclowload) wrote :

この不具合(?)を回避するために、
Gnomeデスクトップ環境におけるAlt+Printの動作を変更する方法を質問しました。
下記の回答が得られました。
https://forums.ubuntulinux.jp/viewtopic.php?pid=55480#p55480

Revision history for this message
midspeclowload (midspeclowload) wrote :

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,

summary: - gnome-keybinding-propertiesがAlt+PrintをAlt+Excuteと誤認する
+ Gnomeデスクトップ環境でカスタムショートカットに割当てたAlt+Printが動作しない
description: updated
Fumihito YOSHIDA (hito)
Changed in ubuntu-jp-improvement:
importance: Undecided → Low
status: New → Triaged
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.