Как избежать получения «элемент инициализатора не является константой» при вызове gtk_accelerator_name в статическом массиве? - PullRequest
1 голос
/ 02 января 2012

Я изменил это:

static GtkActionEntry menu_items[] = {
  { "OpenFile", GTK_STOCK_OPEN, NULL, "<control>O", NULL, G_CALLBACK(file_open) },
  ...
},

... на это:

static GtkActionEntry menu_items[] = {
  { "OpenFile", GTK_STOCK_OPEN, NULL, gtk_accelerator_name(GDK_o, GDK_CONTROL_MASK), NULL, G_CALLBACK(file_open) }, 
  ...
},

... и теперь я получаю "ошибка: элемент инициализатора не является константой". Какие изменения мне нужно сделать, чтобы это работало?

GtkActionEntry Четвертый аргумент является указателем gchar, а gtk_accelerator_name возвращает это, насколько я вижу.

menu_items используется в статической функции, например:

static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);

static GtkWidget *get_menubar_menu(GtkWidget *win) {
  GtkActionGroup *action_group = gtk_action_group_new("Menu");
  gtk_action_group_add_actions(action_group, menu_items, nmenu_items, 0);
  ...
}

1 Ответ

2 голосов
/ 02 января 2012

Вы не можете сделать это, данные static должны быть определены во время компиляции, но gtk_accelerator_name(), вероятно, находится в общем объекте, который может быть даже недоступен при компиляции.

Таким образом, вам нужно добавить код для прохождения массива один раз при запуске, прежде чем вы фактически используете его в вызове gtk_action_group_add_actions(), чтобы передать каждую строку в gtk_accelerator_name() по мере необходимости.

...