繁体   English   中英

在简单的gtk键按事件示例中,GDK_SHIFT_MASK似乎被忽略

[英]In simple gtk key press event example, GDK_SHIFT_MASK seems to be ignored

有人可以编译并执行我在下面提供的小样本代码吗? 如果shift键修饰符适合您,请告诉我。 此示例假设演示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,即使我已阅读文档并且我已经看到很多其他示例似乎在使用它完全一样的方式。

按Shift + s时event- event->keyval的值是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)
  {
....

只是为了人们使用Gtk3并使用此代码作为基础。 宏已更改, GDK_s现在为GDK_KEY_s 按原样编译此代码将不起作用。 更新的Keyvals的完整列表如下: https ://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM