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.
Bạn nhận được đầu ra đó cho đầu vào chính xác? – ptomato
@ptomato Đầu ra mô tả chính xác đầu vào. – nomadicME