Ускоритель GTK 2 Ctrl-Z не срабатывает - PullRequest
0 голосов
/ 01 октября 2018

Я создаю простое приложение с GTK + 2, и у меня есть типичное меню «Правка» с элементами;Отменить, повторить, вырезать, копировать и вставить.Я создаю свое меню «Правка» следующим образом (извиняюсь за многословие):

GtkWidget* get_editmenu(GtkWidget *window)
{
  GtkWidget
    *menu,
    *menuitem,
    *item
  ;
  GtkAccelGroup *group;

  menu = gtk_menu_new();
  group = gtk_accel_group_new();

  gtk_menu_set_accel_group(GTK_MENU(menu), group);
  gtk_window_add_accel_group(GTK_WINDOW(window), group);

  menuitem = gtk_menu_item_new_with_label("Edit");
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);

  item = gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDO, group);
  g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_undo), NULL);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);

  item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REDO, group);
  g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_redo), NULL);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);

  gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());

  item = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, group);
  g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_copy), NULL);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);

  item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT, group);
  g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_cut), NULL);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);

  item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, group);
  g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_paste), NULL);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);

  return menuitem;
}

Эта функция просто возвращает элемент меню верхнего уровня (т. Е. Элемент «Редактировать»), который затем добавляется в строку меню:

GtkWidget* get_menubar(GtkWidget *window)
{
  GtkWidget *menubar;

  menubar = gtk_menu_bar_new();

  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), get_filemenu(window));
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), get_editmenu(window));
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), get_helpmenu(window));

  return menubar;
}

Это прекрасно работает.Мои ускорители работают для Ctrl + O (открыть файл), Ctrl + Q (выход из приложения), Ctrl + C (копирование) и т. Д. Однако, Ctrl + Z не вызывает обратный вызов Undo, как и Ctrl+ Shift + Z для повтора.Когда я запускаю их вручную, открывая меню «Правка» и выбирая их одним щелчком, мои обратные вызовы запускаются очень хорошо.

Как я могу активировать элементы отмены и возврата, используя Ctrl + Z и Ctrl + Shift + Z

...