TL; DR
Đây là một lớp học:
KeyManager: new Lang.Class({
Name: 'MyKeyManager',
_init: function() {
this.grabbers = new Map()
global.display.connect(
'accelerator-activated',
Lang.bind(this, function(display, action, deviceId, timestamp){
log('Accelerator Activated: [display={}, action={}, deviceId={}, timestamp={}]',
display, action, deviceId, timestamp)
this._onAccelerator(action)
}))
},
listenFor: function(accelerator, callback){
log('Trying to listen for hot key [accelerator={}]', accelerator)
let action = global.display.grab_accelerator(accelerator)
if(action == Meta.KeyBindingAction.NONE) {
log('Unable to grab accelerator [binding={}]', accelerator)
} else {
log('Grabbed accelerator [action={}]', action)
let name = Meta.external_binding_name_for_action(action)
log('Received binding name for action [name={}, action={}]',
name, action)
log('Requesting WM to allow binding [name={}]', name)
Main.wm.allowKeybinding(name, Shell.ActionMode.ALL)
this.grabbers.set(action, {
name: name,
accelerator: accelerator,
callback: callback,
action: action
})
}
},
_onAccelerator: function(action) {
let grabber = this.grabbers.get(action)
if(grabber) {
this.grabbers.get(action).callback()
} else {
log('No listeners [action={}]', action)
}
}
})
Và đó là cách bạn sử dụng nó:
let keyManager = new KeyManager()
keyManager.listenFor("<ctrl><shift>a", function(){
log("Hot keys are working!!!")
})
Bạn sẽ cần nhập khẩu:
const Lang = imports.lang
const Meta = imports.gi.Meta
const Shell = imports.gi.Shell
const Main = imports.ui.main
Để ngừng nghe:
for (let it of keyManager.grabbers) {
global.display.ungrab_accelerator(it[1].action)
Main.wm.allowKeybinding(it[1].name, Shell.ActionMode.NONE)
}
Giải trình
Tôi có thể sai lầm khủng khiếp, nhưng đó là những gì tôi đã tìm ra trong vài ngày qua.
Trước hết, đó là Mutter, người chịu trách nhiệm lắng nghe các phím nóng. Mutter là một khung để tạo Trình quản lý cửa sổ, bản thân nó không phải là trình quản lý cửa sổ. Gnome Shell có một lớp được viết bằng JS và được gọi là "Trình quản lý cửa sổ" - đây là Trình quản lý cửa sổ thực sự sử dụng Mutter bên trong để thực hiện tất cả các công cụ cấp thấp. Mutter có một đối tượng MetaDisplay. Đây là đối tượng bạn sử dụng để yêu cầu nghe một phím nóng. Nhưng! Nhưng Mutter sẽ yêu cầu Window Manager phê duyệt việc sử dụng phím nóng này. Vậy điều gì xảy ra khi nhấn phím nóng? - MetaDisplay tạo ra sự kiện 'bộ lọc khóa'. - Trình quản lý cửa sổ trong Gnome Shell kiểm tra xem phím nóng này có được phép xử lý không. - Trình quản lý cửa sổ trả về giá trị phù hợp cho MetaDisplay - Nếu được phép xử lý phím nóng này, MetaDisplay sẽ tạo ra sự kiện 'kích hoạt trình tăng tốc'