Chinaunix首页 | 论坛 | 博客
  • 博客访问: 732896
  • 博文数量: 181
  • 博客积分: 2548
  • 博客等级: 少校
  • 技术积分: 1819
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-29 16:36
个人简介

爱咋咋地

文章分类

全部博文(181)

文章存档

2024年(5)

2023年(18)

2022年(19)

2021年(3)

2020年(1)

2018年(1)

2017年(1)

2014年(1)

2013年(4)

2012年(11)

2011年(19)

2010年(22)

2009年(71)

2008年(5)

分类: LINUX

2024-01-05 12:37:38

本人平时喜欢尽可能少让双手离开键盘,鼠标越少用越好。所以对系统的快捷键设置的比较多。
{BANNED}最佳近遇到一个奇怪的事情,在xterm里面使用转义序列(escape sequence)自定义了一组按键。
Shift+Alt+h等等,其他按键都很好,唯独这个Shift+Alt+h有问题。
翻边了所有快捷键配制,没有发现有其他快捷键设置为一样而冲突的情况,但这个按键就是不生效。
在全网搜索也没有发现有同样问题的人,但有个国外的老兄给了个思路和方法。使用下面的命令可以查看该按键是否激活了某个grab?

命令如下:
sleep 3; xdotool key "XF86LogGrabInfo"

在sleep的3秒钟,一直按住Shift+Alt+h,直到命令结束。然后查看Xorg的日志文件。
vim /var/log/Xorg.1.log

37099 [ 15073.067] End list of registered passive grabs      
37100 [ 15305.682] (II) Printing all currently active device grabs:              
37101 [ 15305.682] Active grab 0x4022a0e7 (xi2) on device 'Virtual core keyboard' (3):
37102 [ 15305.682]       client pid 2229 /usr/bin/gnome-shell
37103 [ 15305.682]       at 15303526 (from passive grab) (device thawed, state 1) 
37104 [ 15305.682]       xi2 event mask for device 3: 0xc000
37105 [ 15305.682]       passive grab type 2, detail 0x2b, activating key 43
37106 [ 15305.682]       owner-events false, kb 0 ptr 1, confine 0, cursor 0x0
37107 [ 15305.682] (II) End list of active device grabs                   

可以看到这个快捷键被gnome-shell给截获了。
又再次把系统的快捷键和extensions的快捷键翻了一边也没有发现冲突。
再次想起用xev看看情况。
KeyPress event, serial 37, synthetic NO, window 0x3600001,
    root 0x7a5, subw 0x0, time 13650386, (71,62), root:(109,169),
    state 0x10, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 37, synthetic NO, window 0x3600001,
    root 0x7a5, subw 0x0, time 13651791, (71,62), root:(109,169),
    state 0x11, keycode 64 (keysym 0xffe7, Meta_L), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

FocusOut event, serial 37, synthetic NO, window 0x3600001,
    mode NotifyGrab, detail NotifyAncestor

FocusOut event, serial 37, synthetic NO, window 0x3600001,
    mode NotifyUngrab, detail NotifyPointer

FocusIn event, serial 37, synthetic NO, window 0x3600001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 37, synthetic NO, window 0x0,
    keys:  4294967229 0   0   0   0   0   4   0   1   0   0   0   0   0   0   0
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

KeyRelease event, serial 37, synthetic NO, window 0x3600001,
    root 0x7a5, subw 0x0, time 13654827, (71,62), root:(109,169),
    state 0x19, keycode 64 (keysym 0xffe7, Meta_L), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x3600001,
    root 0x7a5, subw 0x0, time 13654889, (71,62), root:(109,169),
    state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

上面是所有从按下Shift,然后Alt,然后h各阶段发出的事件,可以看到按了h后,有两个FocusOut和一个FocusIn,说明这个按键真的被grab了,但没有更多其他信息。KeymapNotify event里面的信息网上也没找到任何明确的说法。
在实在没有任何头绪的时候,就把所有的按键全部都按了一遍。
你别说,你还真别说。还真被试出了规律。
我在系统中设置了很多个Alt+快捷键来执行各种常用工具,比如Alt+h就是切换到chrome。

经过测试发现,所有被我设置过的Alt+的所对应的Shift+Alt+都不能被xterm接收到。

这就是说在系统设置快捷键时,虽然我设置的是Alt+,但实际上系统把包含其他的modifier的情况也算进去了。但在遍历完所有注册的快捷键,在全部都没有匹配上的情况下并没有重新丢给当前窗口。

后面还发现了一个现象,如果把大写打开,xterm就能够接收到Shift+Alt+h了,也算是一种解决方法,毕竟这个组合使用的频率很低。

{BANNED}最佳后下载了gnome-shell的源码,也没有找到明确的说法,以后再说吧

一些使用过的命令,放在这里,算是个记录吧
sleep 3; xdotool key "XF86LogGrabInfo"
xkbcomp -xkb $DISPLAY active_map.txt
vi /usr/include/X11/keysymdef.h
xinput list
gsettings list-recursively | grep ''ALT"
setxkbmap -print -verbose 10
阅读(8536) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~