Как связать клавишу ESC, чтобы закрыть `gwindow()` в gWidgets?

Рассмотреть возможность:

require(gWidgets2)
w <- gwindow("notebook example", visible=T)
nb <- gnotebook(container=w)
gbutton("Page one", label="tab 1", container=nb) ## note label argument
gbutton("Page two", label="tab 2", container=nb)

Как я могу связать заданную клавишу (скажем, ESC), чтобы закрыть gwindow() в gWidgets, то есть выполнить dispose(w)? Другими словами, как вы назначаете сочетания клавиш в gWidgets?


person landroni    schedule 12.07.2014    source источник


Ответы (2)


С RGtk2 (и, возможно, другими) метод addHandlerKeystroke можно использовать для перехвата нажатий клавиш. Вы должны копаться в объекте h, чтобы получить ключ ESC. Для этого нет переносимого кода, но документы Gtk должны помочь.

person jverzani    schedule 12.07.2014
comment
Используя эти инструкции, мне удалось найти решение. См. отдельный ответ. - person landroni; 13.07.2014
comment
Однако один вопрос: как я могу захватить ключ F4? Если я воспользуюсь этим методом и нажму F4, затем h$key=="", так что это, очевидно, не будет захвачено. - person landroni; 13.07.2014

Согласно принятому ответу, мне пришлось:

addHandlerKeystroke(w, function(h, ...){
    browser()
})

Затем откройте окно w и нажмите ESC, затем в терминале browser():

print(h)

И обратите внимание, что:

Browse[1]> h$key
[1] "\033"

Затем следующий обработчик делает то, что я хочу:

h_esc <- addHandlerKeystroke(w, function(h, ...){
    if(h$key=="\033") dispose(w)
})

Согласно , как запрограммировать окно для закрытия с помощью клавиши escape и Как определить символ ESC в git? кажется, что ESC часто записывается как \033.

person landroni    schedule 12.07.2014
comment
Это, вероятно, определено в перечислении, но вам нужно покопаться в документации Gtk, чтобы узнать, как это называется. - person jverzani; 14.07.2014
comment
Спасибо, но теперь я нашел проблему с решением для ESC: оказалось, что gWidgets2 захватывает все ESC экземпляры. Так, например, если я щелкну правой кнопкой мыши заголовок диспетчера окон, чтобы получить параметры WM, а затем нажму ESC, gWidgets2 неожиданно активирует обработчик addHandlerKeystroke. Вместо этого я ожидал, что меню Gtk закроется, но окно останется открытым; Я ожидал, что только секунда ESC закроет окно. Я ошибаюсь? - person landroni; 14.07.2014
comment
Я не знаю, как отфильтровать эти события, возможно, что-то есть в информации о событии. Как бы то ни было, обработчик событий привязан к виджету окна и вызывается, когда этот виджет получает фокус и нажимается клавиша esc. - person jverzani; 14.07.2014
comment
Хм, может ли gWidgets2 определить, что виджет больше не находится в фокусе? Когда всплывающее контекстное меню WM или всплывающее окно завершения Gtk (скажем, в виджете gedit) отображается, то w фактически теряет фокус: прокрутка в главном окне работает только тогда, когда всплывающее окно исчезнет, ​​и < i>любой щелчок мышью в любом месте окна w в первую очередь приведет к удалению этого всплывающего контекстного меню. Так может ли gWidgets2 определить, когда он теряет фокус на каком-то всплывающем окне? - person landroni; 14.07.2014
comment
Может быть, здесь можно использовать addHandlerBlur? - person jverzani; 14.07.2014
comment
Можно ли временно отключить обработчик? Я пробовал addHandlerBlur(w, function(h, ...){enabled(h_esc) <- FALSE}), но это, похоже, не имеет никакого эффекта. - person landroni; 14.07.2014
comment
есть методы blockHandler и unblockHandler. Удачи. - person jverzani; 15.07.2014
comment
Хм, я не понимаю, как использовать часть `blockHandler(obj, ID, ...), especially the ID` (документы не совсем понятны). Если я делаю blockHandler(w, h_esc) или blockHandler(w, 'h_esc'), то получаю сообщение об ошибке: Ошибка в id$signal: оператор $ недействителен для атомарных векторов. Как определить ID, возвращаемый обработчиком? - person landroni; 15.07.2014
comment
он возвращается addHandler. - person jverzani; 15.07.2014
comment
Извините, но я все еще в замешательстве. Если я попробую addHandlerBlur(w, function(h, ...){ print(addHandler(w)) }), я просто получу NULL в качестве возвращаемого значения. Должно быть, я делаю это неправильно. - person landroni; 15.07.2014
comment
О боже, это неловко. Теперь это исправлено, но вам нужно обновить как gWidgets2, так и gWidgets2RGtk2. - person jverzani; 16.07.2014