2013-04-25 5 views
1

사용자 키를 잡으려고 GUI 창에서 Ctrl + d를 누릅니다. 내 코드는 다음과 같습니다GDK 신호, 키 누르기 및 키 마스크

이 내 노트북에서 작동
static gboolean 
callback(GtkWidget *widget, 
     GdkEventKey *event, 
     gpointer data) 
{ 
    if(event->state == GDK_CONTROL_MASK && event->keyval == 'd') 
     gtk_main_quit(); 

    return FASLE; 
} 

(우분투 11.04, GCC 4.5.2, libgtk 2.24.4). 그러나 새로운 시스템 (Ubuntu 12.10, gcc 4.7.2, libgtk 2.24.13)에서 동일한 작업을 수행하면 작동하지 않습니다.

는 I는 I가 Ctrl을 누르면 event->state는 문서 (20) 대신에 4 또는 1 < < 2임을 나타내고 상기 if 문 앞에 g_print("%u\n", event->state); 첨가. GDK_CONTROL_MASK을 20으로 변경하면 최신 시스템에서는 작동하지만 이전 시스템에서는 작동하지 않습니다. 누군가 이것이 왜 일어나고 어떻게 해결해야하는지 말해주십시오.

답변

4

event->statebitmap입니다. 즉, 값 20은 "20 대신 4"를 의미하지 않고 "4와 16은 동시에"를 의미합니다. 헤더에 따르면 값 16 (1 << 4)은 MOD2 수정 자에 해당하며 노트북의 fn 키와 일치 할 수 있습니다.

if (event->state & GDK_CONTROL_MASK && event->keyval == 'd') 

두 시스템에서 동작 할 :

간단한 수정 다른 개질제를 무시하면서 제어를 확인하기 & 연산자를 사용하는 것이다.

+0

많은 시스템에서 MOD2는 num lock입니다. 그래서 그것을 외면하는 것이 합리적입니다. CONTROL이 설정되어 있는지 확인하는 것만으로 Ctrl + Alt + D, Ctrl + Shift + D 등의 Ctrl + D도 처리 할 수 ​​있습니다. 이는 이상적이지 않습니다. – Mikel

0

state에는 Caps Lock 및 Num Lock과 같은 수정자가 포함되어 있기 때문에 이러한 현상이 발생합니다.

이 솔루션은 https://developer.gnome.org/gtk3/stable/checklist-modifiers.html에 설명되어 있습니다 :

사용 gtk_accelerator_get_default_mod_mask()도 (슈퍼, 하이퍼, 그리고 메타를 제어, Alt 키, 시프트) 키를이 그래픽 카드하고있는 수정의 비트 맵을 얻기 위해, 다음 비트 및 이벤트 상태를 예 :

GdkModifierType accel_mask = gtk_accelerator_get_default_mod_mask(); 

if (event->state & accel_mask == GDK_CONTROL_MASK && event->keyval == 'd') 
    ...