Error compiling GTK Accelerator (C programming)

I believe this may be a difference in GTK+-2.0 and GTK+-3.0. I followed this tutorial and ended up with this error:

# gcc -Wall -g mnemonics.c -o mnemonics `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0`
mnemonics.c: In function �main':
mnemonics.c:44:61: error: �GDK_q' undeclared (first use in this function)
mnemonics.c:44:61: note: each undeclared identifier is reported only once for each function it appears in

I double-checked and I have all the correct header files installed in the correct locations.

Here is my code:

#include <gtk/gtk.h>                                                                                                                                                                
#include <gdk/gdkkeysyms.h>                                                                                                                                                         
                                                                                                                                                                                    
int main(int argc, char *argv[])                                                                                                                                                    
{                                                                                                                                                                                   
                                                                                                                                                                                    
  GtkWidget *window;                                                                                                                                                                
  GtkWidget *vbox;                                                                                                                                                                  
                                                                                                                                                                                    
  GtkWidget *menubar;                                                                                                                                                               
  GtkWidget *filemenu;                                                                                                                                                              
  GtkWidget *file;                                                                                                                                                                  
  GtkWidget *new;                                                                                                                                                                   
  GtkWidget *open;                                                                                                                                                                  
  GtkWidget *quit;                                                                                                                                                                  
                                                                                                                                                                                    
  GtkWidget *sep;                                                                                                                                                                   
                                                                                                                                                                                    
  GtkAccelGroup *accel_group = NULL;                                                                                                                                                

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
  gtk_window_set_title(GTK_WINDOW(window), "menu");

  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  // In this code we create a menubar and a menu.
  menubar = gtk_menu_bar_new();
  filemenu = gtk_menu_new();

  accel_group = gtk_accel_group_new();
  gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);

  file = gtk_menu_item_new_with_mnemonic("_File");
  new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL);
  open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
  sep = gtk_separator_menu_item_new();
  quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group);

  gtk_widget_add_accelerator(quit, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);

  // The code line below implements a file menu
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
  // Here menu items are implemented
  gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), new);
  gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open);
  gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), sep);
  gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);

  g_signal_connect_swapped(G_OBJECT(window), "destroy",
        G_CALLBACK(gtk_main_quit), NULL);

  g_signal_connect(G_OBJECT(quit), "activate",
        G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;

}

It looks like a typo on their part.

It's not defined as GDK_q, it's defined as GDK_Q

1 Like

Did you mean to use GDK_KEY_q instead of GDK_q ?

gtk_widget_add_accelerator(quit, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
1 Like

GDK_KEY_q worked for me, GDK_Q did not. Perhaps its the difference in 2.0 vs 3.0? None the less, that was a very nice link Corona688 pointed to.

Thank you both!