2012-04-13 29 views
10

Có thể ai đó vui lòng biên dịch và thực thi mã mẫu nhỏ mà tôi đã cung cấp bên dưới không? Vui lòng cho tôi biết nếu công cụ sửa đổi khóa thay đổi hoạt động đúng cho bạn. Ví dụ này giả sử để minh họa chức năng nhấn phím trong gtk. Nó hoạt động tốt cho các phím bấm đơn giản và thậm chí làm việc với công cụ sửa đổi phím điều khiển, nhưng nó không hoạt động với công cụ sửa đổi phím shift.Trong ví dụ sự kiện bấm phím gtk đơn giản, GDK_SHIFT_MASK dường như bị bỏ qua

/* 
* 
* compile command: 
* 
* gcc keypress3.c -o keypress3 `pkg-config --libs --cflags gtk+-2.0` 
* 
*/ 

#include <gtk/gtk.h> 
#include <gdk/gdkkeysyms.h> 

gboolean 
on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data); 

int main (int argc, char *argv[]) 
{ 
    GtkWidget *window; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 

    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); 
    g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (on_key_press), NULL); 

    gtk_widget_show_all (window); 

    gtk_main(); 

    return 0; 
} 

gboolean 
on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) 
{ 
    switch (event->keyval) 
    { 
    case GDK_p: 
     printf("key pressed: %s\n", "p"); 
     break; 
    case GDK_s: 
     if (event->state & GDK_SHIFT_MASK) 
     { 
     printf("key pressed: %s\n", "shift + s"); 
     } 
     else if (event->state & GDK_CONTROL_MASK) 
     { 
     printf("key pressed: %s\n", "ctrl + s"); 
     } 
     else 
     { 
     printf("key pressed: %s\n", "s"); 
     } 
     break; 
    case GDK_m: 
     if (event->state & GDK_SHIFT_MASK) 
     { 
     printf("key pressed: %s\n", "shift + m"); 
     } 
     else if (event->state & GDK_CONTROL_MASK) 
     { 
     printf("key pressed: %s\n", "ctrl + m"); 
     } 
     else 
     { 
     printf("key pressed: %s\n", "m"); 
     } 
     break; 

    default: 
     return FALSE; 
    } 

    return FALSE; 
} 

Kết quả tôi nhận được:

key pressed: m 
key pressed: ctrl + m 
key pressed: p 
key pressed: ctrl + s 
key pressed: s 

Tôi nhận được gì khi tôi nhấn shift + s hoặc shift + m, vì vậy có vẻ như rằng tôi không hoàn toàn nhận được như thế nào GDK_SHIFT_MASK nên được sử dụng ngay cả mặc dù tôi đã đọc tài liệu và tôi đã nhìn thấy rất nhiều ví dụ khác mà nó dường như được sử dụng chính xác theo cùng một cách.

+0

Bạn nhận được đầu ra đó cho đầu vào chính xác? – ptomato

+0

@ptomato Đầu ra mô tả chính xác đầu vào. – nomadicME

Trả lời

15

Giá trị của event->keyval khi shift + s được nhấn là GDK_S chứ không phải GDK_s. Nói cách khác, GDK đã giải thích bàn phím cho bạn, cho bạn biểu tượng 'S', không phải 's'. Mặt nạ thay đổi vẫn được thiết lập. Bạn có thể thấy điều này bằng cách thêm trường hợp cho GDK_S:

... 
case GDK_S: // add this line 
case GDK_s: 
    if (event->state & GDK_SHIFT_MASK) 
    { 
    printf("key pressed: %s\n", "shift + s"); 
    } 
    else if (event->state & GDK_CONTROL_MASK) 
    { 
.... 
+0

doh! đã làm tôi bối rối quá lâu và dường như nó rất rõ ràng khi bạn giải thích nó. :) Cảm ơn. – nomadicME

5

Chỉ cần hướng dẫn người dùng Sử dụng Gtk3 và sử dụng mã này làm cơ sở. Macros đã thay đổi và GDK_s hiện là GDK_KEY_s. Biên dịch mã này vì nó sẽ không hoạt động. Danh sách đầy đủ các Khoảng thời gian được cập nhật ở đây: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h

+0

Đây không phải là câu trả lời và phải là nhận xét về bài đăng mà nó phản hồi. Tôi hy vọng dân gian không chỉ sử dụng mã từ bài viết SO bán buôn làm cơ sở cho riêng họ ... và những người đã nhanh chóng tìm ra vấn đề bằng cách đọc lỗi và tài liệu ... nhưng tôi có thể quá lạc quan ở đó. Vì vậy, điều này cũng có thể hữu ích. Nhưng nó vẫn không phải là câu trả lời. –

Các vấn đề liên quan