내가 몇 가지를 시도하고 해결책에 근접 할 수있다 그러나 여기 간다 어려움을 겪고 ... (아마도) 된 위젯GTK + 3.x의 키 바인딩 -
은 누구나 말의 좋은 예를 가지고있다 또는 다운 CTRL을 ALT + 수신부 GtkEntry
위젯+ N "새로운"신호 등을 올릴 키 누름 위젯에 SIG-NEW
. 나는 g_signal_connect
으로 잡는 법을 안다.
내가 몇 가지를 시도하고 해결책에 근접 할 수있다 그러나 여기 간다 어려움을 겪고 ... (아마도) 된 위젯GTK + 3.x의 키 바인딩 -
은 누구나 말의 좋은 예를 가지고있다 또는 다운 CTRL을 ALT + 수신부 GtkEntry
위젯+ N "새로운"신호 등을 올릴 키 누름 위젯에 SIG-NEW
. 나는 g_signal_connect
으로 잡는 법을 안다.
최소한의 작동 예제가 추가되었습니다.
GtkEntry
의 key-press-event
을 적절한 콜백에 연결하는 것이 중요합니다. 그 콜백에서는 GdkEvent
구조체의 멤버 인 구조체 인 GdkEventKey
구조체를 콜백 함수의 매개 변수로 추출해야합니다.
GdkEventKey
에는 어떤 키 + 수정자가 눌러 졌는지 확인하는 데 필요한 모든 정보가 포함되어 있습니다.
코드를 gtk+-3.0
으로 테스트 했으므로 위젯의 GdkEventMask
을 수정하여 key-press-event
을 수신해야 할 수도 있습니다. gtk+-3.0
의 경우 이미 기본 설정으로 보입니다. 콜백이 호출되지 않으면 gdk_window_set_events()
으로 활성화해야합니다 (당연히 위젯의 gdk 창에서 호출해야합니다).
#include <gtk/gtk.h>
#include <glib.h>
gboolean
key_press_event_cb (GtkWidget * widget, GdkEvent * event,
gpointer data)
{
GdkEventKey key = event->key;
/* check modifier key */
/* on most keyboards GDK_MOD1_MASK is the Alt key */
if (key.state == GDK_MOD1_MASK) {
/* check for key that was pressed */
switch (key.keyval) {
case GDK_KEY_d:
g_print
("`Alt-d` deletes the content in the entry box\n");
gtk_entry_set_text (GTK_ENTRY (widget), "");
break;
}
}
/* check for unmodified key presses */
switch (key.keyval) {
case GDK_KEY_x:
g_print
("`x` deletes the content in the entry box\n");
gtk_entry_set_text (GTK_ENTRY (widget), "");
return TRUE;
break;
}
return FALSE;
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *entry;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
entry = gtk_entry_new();
gtk_container_add (GTK_CONTAINER (window), entry);
gtk_widget_show_all (window);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (entry, "key-press-event",
G_CALLBACK (key_press_event_cb), NULL);
gtk_main();
return 0;
}
그것은 [GTK-가속기 얻을 기본-모드 마스크를() (https://developer.gnome.org/gtk3/stable/와'key.state' 마스크 좋은 생각 일 것입니다 gtk3-Keyboard-Accelerators.html # gtk-accelerator-get-default-mod-mask) 캡 잠금 및 num lock 상태 등으로 혼동하지 않도록하십시오. –