1

Доброго времени суток.
Кто-нибудь знает, как получить ID дочернего контрола, созданного Glade с GtkBuilder?

Что имеется ввиду:
При инициализации программы во время загрузки файла glade понятно как получить указатель на структуру нужного элемента:
что-то типа

typedef struct {
  GtkWidget *m_window;
  GtkWidget *statusbar;
  GtkWidget *m_image;
  guint     statusbar_context_id;
  gchar     *filename;
} mozaic, * pmozaic;

GtkDialog * dialog_param;

....

    gtk_builder_add_from_file (builder, BUILDER_XML_FILE, NULL);
   
    pm->m_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window"));
    pm->m_image = GTK_WIDGET (gtk_builder_get_object (builder, "m_image"));
    pm->statusbar = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar"));
    dialog_param = GTK_DIALOG (gtk_builder_get_object (builder, "dialog_param"));
   
    gtk_builder_connect_signals (builder, pm);
    g_object_unref (G_OBJECT (builder));

а вот как потом в обработчике получить конкретный контрол GtkEntry, который вложен в dialog_param?

Я пока пришел только к такой вещи:

прохожу по всем элементам диалога

Это я вызываю в обработчике активации диалога:

gtk_container_foreach(GTK_CONTAINER(dialog_param),(GtkCallback) cb_get_param_value, NULL);

сама калбэк функция:

void
cb_get_param_value(GtkWidget * widget, gpointer callback_data)
{
  g_print("%s\n",gtk_widget_get_name(widget));
  if (GTK_IS_ENTRY(widget))
  {
    g_print("\t%s\n",gtk_entry_get_text(GTK_ENTRY(widget)));

.....

  }
  else if (GTK_IS_CONTAINER (widget))
  {
    gtk_container_foreach(GTK_CONTAINER(widget),(GtkCallback) cb_get_param_value, NULL);
  }
}

И вот как мне в этой функции получить конкретный GtkEntry?

Потому что gtk_widget_get_name(widget) возвращает строку GtkEntry, а не имя, которое я задавал для него в Glade в поле name на вкладке General.

Как вообще получают дочерние элементы, когда интерфейс создается в glade с GtkBuilder?
Чтобы получать их не в момент загрузки файла glade, а получать именно тогда, когда нужно.

2

Чтобы получать имя виджета функцией gtk_widget_get_name(widget) нужно вначале установить это имя
примерно так:

gtk_widget_set_name(GTK_WIDGET (gtk_builder_get_object (builder, "entry1")), "entry_size_cell");

тогда при обходе дочерних виджетов:
gtk_container_foreach(GTK_CONTAINER(dialog_param), (GtkCallback) get_params, NULL);

в функции  get_params можно получить нужный виджет:


get_params (GtkWidget *widget, gpointer p)
{
  if (GTK_IS_CONTAINER(widget))
  {
    gtk_container_foreach(GTK_CONTAINER(widget), (GtkCallback)get_params, p);
  }
  else if (GTK_IS_ENTRY(widget))
  {
    const char * name = gtk_widget_get_name(widget);

    if ( ! strcmp(name,"entry_size_cell"))
    {
      cell = atoi(gtk_entry_get_text(GTK_ENTRY(widget)));
    }
....