2013-07-26 2 views
2

내가 몇 가지를 시도하고 해결책에 근접 할 수있다 그러나 여기 간다 어려움을 겪고 ... (아마도) 된 위젯GTK + 3.x의 키 바인딩 -

은 누구나 말의 좋은 예를 가지고있다 또는 다운 CTRL을 ALT + 수신부 GtkEntry 위젯+ N "새로운"신호 등을 올릴 키 누름 위젯에 SIG-NEW. 나는 g_signal_connect으로 잡는 법을 안다.

답변

1

최소한의 작동 예제가 추가되었습니다.

GtkEntrykey-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; 
} 
+0

그것은 [GTK-가속기 얻을 기본-모드 마스크를() (https://developer.gnome.org/gtk3/stable/와'key.state' 마스크 좋은 생각 일 것입니다 gtk3-Keyboard-Accelerators.html # gtk-accelerator-get-default-mod-mask) 캡 잠금 및 num lock 상태 등으로 혼동하지 않도록하십시오. –