В простом примере нажатия клавиши gtk GDK_SHIFT_MASK игнорируется
Может ли кто-то запросить компиляцию и выполнить небольшой пример кода, представленный ниже? Пожалуйста, дайте мне знать, если модификатор ключа переключения работает правильно для вас. Этот пример должен продемонстрировать функциональность нажатия клавиш в gtk. Он отлично работает для простого нажатия клавиш и даже работает с модификатором ключа управления, но он не работает с модификатором клавиши shift.
/*
*
* 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;
}
Выход, который я получаю:
key pressed: m
key pressed: ctrl + m
key pressed: p
key pressed: ctrl + s
key pressed: s
Я ничего не получаю, когда нажимаю shift + s или shift + m, поэтому кажется, что я не совсем понимаю, как использовать GDK_SHIFT_MASK, хотя я прочитал документацию, и я видел много других примеров, где он появляется для использования точно так же.
Ответы
Ответ 1
Значение event->keyval
при нажатии shift + s - это GDK_S, а не GDK_s. Другими словами, GDK уже интерпретировал клавиатуру для вас, предоставляя вам символ "S", а не "s". Маска смены все еще установлена. Вы можете это увидеть, добавив случай для 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)
{
....
Ответ 2
Просто голова для людей. Использование Gtk3 и использование этого кода в качестве базы. Макросы изменены, а GDK_s
теперь GDK_KEY_s
. Компиляция этого кода, поскольку он не будет работать. Полный список обновленных Keyvals находится здесь:
https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h