LINUX.ORG.RU

[gtk] Опять проблемы с `GTK_IS_WINDOW (window)' failed


0

0

Доброго времени суток ЛОР. Опять возникли проблемы в С/gtk+ приложении и опять GTK_IS_WINDOW (window)' failed. На этот раз пытаюс поменять заголовок главного окна в зависимости от загруженного файла.

Функция обновления заголовка:

void update_title(const char *filename, MainWin* mw )
{
    GtkButton* btn = gtk_button_new();
    static char fname[50];

    if(filename != NULL)
    {
      strncpy(fname, filename, 49);
      fname[49] = '\0';
    }
	A param;
	param.mw = (GtkWindow*)mw;
	param.fname = "ASD";
	
	gtk_window_set_title(GTK_WINDOW(mw), fname);
	g_signal_connect(btn, "clicked", G_CALLBACK(gtk_window_set_title), &param);
}

Где A - структура для передачи параметров в gtk_window_set_title:

typedef struct _a
{
  MainWin* mw;
  char *fname;
}A;

Когда вызываю функцию заголовок окна не изменяется и вылазит ошибка:Gtk-CRITICAL **: gtk_window_set_title: assertion `GTK_IS_WINDOW (window)' failed

Спасибо


Разобрался, проблема была в совместимости типов.

shk ()

> A param;

param создается на стеке, и к моменту вызова коллбэка на этом месте уже будет записан мусор. Надо создавать A в куче (malloc или new), а в коллбэке - удалять. Ну или хранить в глобальной переменной.

dmitry_vk ★★★ ()

> g_signal_connect(btn, «clicked», G_CALLBACK(gtk_window_set_title), &param);

Это тоже очень не хорошо. Сигнатура gtk_window_set_title не совпадает с сигнатурой обработчик сигнала clicked.

dmitry_vk ★★★ ()

Нет все таки не работает :(.

Убрал полностью структуру. Значит так у меня есть функция смены заголовка окна:

void update_title(const char *filename, MainWin* mw )
{
    static int wid, hei;
    static char fname[50];
    char buf[100];

    if(filename != NULL)
    {
      strncpy(fname, filename, 49);
      wid = gdk_pixbuf_get_width(  gtk_image_view_get_pixbuf (GTK_IMAGE_VIEW(aview)) );
      hei = gdk_pixbuf_get_height( gtk_image_view_get_pixbuf ( GTK_IMAGE_VIEW(aview)) );
      fname[49] = '\0';
    }
	        
	snprintf(buf, 100, "%s (%dx%d) %d%%", fname, wid, hei, (int)(mw->scale * 100));
	gtk_window_set_title(mw, buf);
}

Вызываю функцию первый раз срабатывает, на второй Gtk-CRITICAL **: gtk_window_set_title: assertion `GTK_IS_WINDOW (window)' failed

shk ()
Ответ на: комментарий от shk

Ну раз один раз срабатывает, и mw внутри функции никак не меняется, видимо, проблема не в ней. Где-то между вызовами функции ты портишь объект или второй раз неправильно вызываешь.

Gvidon ★★★★ ()
Ответ на: комментарий от Gvidon

Вызывается одна и та же функция. Например:

void main_win_open(MainWin* mw)
{
 ...
 gtk_window_set_title(mw,"BLA-BLA-BLA");
 ...
}

Вызывается первый раз срабатывает нормально, вызывается последующие разы выкидывает ошибку.

shk ()
Ответ на: комментарий от Gvidon

>Где-то между вызовами функции ты портишь объект

В каком смысле портишь объект? Приведение к другому типу?

shk ()
Ответ на: комментарий от shk

В том случае с фулскрином добавлял в main_win_init:

widget_class->window_state_event = on_win_state_event;

Может тут тоже нужно что-то добавить наподобии

shk ()
Ответ на: комментарий от shk

а теперь diff'ом пройдись и зацени разницу )))

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.