LINUX.ORG.RU

Снова про gtk+ - проблема маленькая


0

0

Вообщем сидел писал себе писал - вчера пиво пили много - вообщем
дело такое - не могу понять от чего ворнинг возникает.
Вообщем есть собственный виджет - видимо ошибка в blahblah_init()

(oap-unstable:1133): Gtk-CRITICAL **: file gtkbox.c: line 374 (gtk_box_pack_start): assertion `child->parent == NULL' failed

вот это ворнинг - виджет создаеться и все работает, но ворнинг
все же напрягает.

Собственно код виджета.

значит хидер

#define BROWSEBB_TYPE   (browsebb_get_type ())
#define BROWSEBB(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj), BROWSEBB_TYPE, Browsebb))
#define BROWSEBB_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), BROWSEBB_TYPE, BrowsebbClass))
#define IS_BROWSEBB(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BROWSEBB_TYPE))
#define IS_BROWSEBB_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), BROWSEBB_TYPE))

typedef struct _Browsebb Browsebb;
typedef struct _BrowsebbClass BrowsebbClass;

struct _Browsebb
{
    GtkVBox vbox;

    /*our varios widgets*/
    GtkWidget *list; /*I think that maybe we need for use it*/
};

/*our class we inherited GtkVBox*/

struct _BrowsebbClass
{
    GtkVBoxClass parent_class;

    void (* browsebb) (Browsebb *bb);

};

GType browsebb_get_type(void); /*get type*/
GtkWidget* browsebb_new(void); /*create our widget*/

в начале Я заголовок скипнул и инслюды тоже.

Сам сишный код - 

/*
 * OAP GUI part: browsebb widget
 *
 * this widget for manipulate billbaords base
 *
 * Originally written by Alphex Kaanoken <alphex@crew.org.ru>
 *
 * under CPL
 */

#include "browsebb_widget.h"
#include "bblist_widget.h" /*this widget contains bblist*/

/*enumeration for our signals*/
enum
{
    CLOSE_SIGNAL,
	DELETE_SIGNAL,
	ADD_SIGNAL,
	EDIT_SIGNAL,
	VIEW_SIGNAL,
	LAST_SIGNAL
};

/*our signals definion*/
static gint browsebb_signals[LAST_SIGNAL]={0};

/*internal callbacks*/
static void close_clicked(GtkWidget *widget,Browsebb *bb)
{
    g_signal_emit(G_OBJECT(bb),browsebb_signals[CLOSE_SIGNAL],0);
}

static void delete_clicked(GtkWidget *widget,Browsebb *bb)
{
    g_signal_emit(G_OBJECT(bb),browsebb_signals[DELETE_SIGNAL],0);
}

static void add_clicked(GtkWidget *widget,Browsebb *bb)
{
    g_signal_emit(G_OBJECT(bb),browsebb_signals[ADD_SIGNAL],0);
}

static void edit_clicked(GtkWidget *widget,Browsebb *bb)
{
    g_signal_emit(G_OBJECT(bb),browsebb_signals[EDIT_SIGNAL],0);
}

static void view_clicked(GtkWidget *widget,Browsebb *bb)
{
    g_signal_emit(G_OBJECT(bb),browsebb_signals[VIEW_SIGNAL],0);
}

/*create signals*/
static void browsebb_class_init(BrowsebbClass *class_)
{
    /*when close button clicked*/
    browsebb_signals[CLOSE_SIGNAL]=g_signal_new("close_clicked",G_TYPE_FRO
M_CLASS(class_),
						G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
						G_STRUCT_OFFSET(BrowsebbClass,browsebb),
						NULL,NULL,
						g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0);
    /*when delete button clicked*/
    browsebb_signals[DELETE_SIGNAL]=g_signal_new("delete_clicked",
						 G_TYPE_FROM_CLASS(class_),
						 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
						 G_STRUCT_OFFSET(BrowsebbClass,browsebb),
						 NULL,NULL,
						 g_cclosure_marshal_VOID__VOID,
						 GTK_TYPE_NONE,0);
    /*when add button clicked*/
    browsebb_signals[ADD_SIGNAL]=g_signal_new("add_clicked",
					      G_TYPE_FROM_CLASS(class_),
					      G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
					      G_STRUCT_OFFSET(BrowsebbClass,browsebb),
					      NULL,NULL,
					      g_cclosure_marshal_VOID__VOID,
					      GTK_TYPE_NONE,0);
    /*when edit button clicked*/
    browsebb_signals[EDIT_SIGNAL]=g_signal_new("edit_clicked",
					       G_TYPE_FROM_CLASS(class_),
					       G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
					       G_STRUCT_OFFSET(BrowsebbClass,browsebb),
					       NULL,NULL,
					       g_cclosure_marshal_VOID__VOID,
					       GTK_TYPE_NONE,0);
    /*when view button clicked*/
    browsebb_signals[VIEW_SIGNAL]=g_signal_new("view_clicked",
					       G_TYPE_FROM_CLASS(class_),
					       G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
					       G_STRUCT_OFFSET(BrowsebbClass,browsebb),
					       NULL,NULL,
					       g_cclosure_marshal_VOID__VOID,
					       GTK_TYPE_NONE,0);
}

/*create our widget*/

static void browsebb_init(Browsebb *bb)
{
    /*bb is gtkvbox
     bb->list is bblist*/
    GtkWidget *scrolled;
    GtkWidget *hbox_top;
    GtkWidget *hbox_main;
    GtkWidget *hbox_bottom;
    GtkWidget *pixmap;
    GtkWidget *label_top;
    GtkWidget *delete_button;
    GtkWidget *add_button;
    GtkWidget *edit_button;
    GtkWidget *view_button;
    GtkWidget *close_button;
    GtkWidget *alignment;
    GtkWidget *vbox_butt;
    
    /*in first of all let's create top for displaying what it does mean*/
    alignment=gtk_alignment_new(0,0.5,0,0);
    gtk_widget_show(alignment);
//    gtk_box_pack_start(GTK_BOX(bb),alignment,FALSE,FALSE,1); /*pack alignment to vbox - 1st cell*/
    hbox_top=gtk_hbox_new(FALSE,2);
    gtk_widget_show(hbox_top);
    gtk_container_add(GTK_CONTAINER(alignment),hbox_top); /*pack hbox_top to alignment*/
    
    pixmap=create_pixmap(GTK_WIDGET(bb),"bb24x24.png");
    gtk_widget_show(pixmap);
    
    label_top=gtk_label_new(_("Browse billboards base:"));
    gtk_widget_show(label_top);
    
    gtk_box_pack_start(GTK_BOX(hbox_top),pixmap,FALSE,FALSE,0); /*packing pixmap and label to hbox_top*/
    gtk_box_pack_start(GTK_BOX(hbox_top),label_top,FALSE,FALSE,0);
    
    gtk_box_pack_start(GTK_BOX(bb),alignment,FALSE,FALSE,1); /*pack alignment to vbox - 1st cell*/
    
    /*in second let's create the main content of widget*/
    bb->list=bblist_new();
    gtk_widget_show(bb->list);
    hbox_main=gtk_hbox_new(FALSE,2);
    gtk_widget_show(hbox_main);
    gtk_box_pack_start(GTK_BOX(bb),hbox_main,TRUE,TRUE,0);
    scrolled=gtk_scrolled_window_new(NULL,NULL);
    gtk_widget_show(scrolled);
    gtk_container_add(GTK_CONTAINER(scrolled),bb->list);
    gtk_box_pack_start(GTK_BOX(hbox_main),scrolled,TRUE,TRUE,0);
    /*buttons (view,add,edit,delete)*/
    vbox_butt=gtk_vbox_new(FALSE,0);
    gtk_widget_show(vbox_butt);
    /*view*/
    view_button=gtk_button_new_with_label(_("View selected billboard"));
    gtk_widget_show(view_button);
    gtk_button_set_alignment(GTK_BUTTON(view_button),0,0.5);
    gtk_box_pack_start(GTK_BOX(vbox_butt),view_button,FALSE,FALSE,2);
    /*add*/
    add_button=gtk_button_new_with_label(_("Add new billboard"));
    gtk_widget_show(add_button);
    gtk_button_set_alignment(GTK_BUTTON(add_button),0,0.5);
    gtk_box_pack_start(GTK_BOX(vbox_butt),add_button,FALSE,FALSE,1);
    /*edit*/
    edit_button=gtk_button_new_with_label(_("Edit selected billboard"));
    gtk_widget_show(edit_button);
    gtk_button_set_alignment(GTK_BUTTON(edit_button),0,0.5);
    gtk_box_pack_start(GTK_BOX(vbox_butt),edit_button,FALSE,FALSE,1);
    /*delete*/
    delete_button=gtk_button_new_with_label(_("Delete selected billboards"));
    gtk_widget_show(delete_button);
    gtk_button_set_alignment(GTK_BUTTON(delete_button),0,0.5);
    gtk_box_pack_start(GTK_BOX(vbox_butt),delete_button,FALSE,FALSE,2);
    /*pack it*/
    gtk_box_pack_start(GTK_BOX(hbox_main),vbox_butt,FALSE,FALSE,0);
    gtk_box_pack_start(GTK_BOX(bb),hbox_main,TRUE,TRUE,1);
    
    /*end finally add the close button*/
    hbox_bottom=gtk_hbox_new(TRUE,0);
    gtk_widget_show(hbox_bottom);
    close_button=gtk_button_new_with_label(_("[Close]"));
    gtk_widget_show(close_button);
    gtk_box_pack_start(GTK_BOX(hbox_bottom),close_button,FALSE,FALSE,0);
    gtk_box_pack_start(GTK_BOX(bb),hbox_bottom,FALSE,FALSE,0);
    
    /*now connect the callbacks for emitting widget signal*/
    g_signal_connect(G_OBJECT(view_button),"clicked",
		     G_CALLBACK (view_clicked),bb); /*view button*/
    
    g_signal_connect(G_OBJECT(add_button),"clicked",
		     G_CALLBACK (add_clicked),bb); /*add button*/
    
    g_signal_connect(G_OBJECT(edit_button),"clicked",
		     G_CALLBACK (edit_clicked),bb); /*edit button*/

    g_signal_connect(G_OBJECT(delete_button),"clicked",
		     G_CALLBACK(delete_clicked),bb); /*delete button*/
    
    g_signal_connect(G_OBJECT(close_button),"clicked",
		     G_CALLBACK(close_clicked),bb); /*close button*/

}

GtkWidget* browsebb_new(void)
{
    return GTK_WIDGET(g_object_new(BROWSEBB_TYPE,NULL));
}

/*get type*/
GType browsebb_get_type(void)
{
    static GType bb_type=0;

    /*check*/
    if(!bb_type)
    {
	static const GTypeInfo bb_info=
	{
	    sizeof(BrowsebbClass),
	    NULL,NULL,
		(GClassInitFunc) browsebb_class_init,
		NULL,NULL,
		sizeof(Browsebb),0,
		(GInstanceInitFunc)browsebb_init,
	};
	/*set op_type*/
	bb_type=g_type_register_static(GTK_TYPE_VBOX,"Browsebb",
				       &bb_info,0);
    }
    return bb_type;
}

и где косяк? может действительно вчера Я пиво много зря пил ?=)

Хоть убей найти не могу свой же косяк =((

alphex_kaanoken ★★★
() автор топика

"warning" возникает от того, что ты уже упакованый куда-то виджет пытаешься снова куда-то упаковать. в данном коде я (быстро поглядев) не заметил такого места. Но тут у тебя не весь код, как я понял (всякие bblist*() не показаны)

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

могу показать виджет тот что bblist - но он рабочий

Я его паковал там не было ворнингов - видимо в _init() косяк какой то =(

найти не могу все - пойду пиво пить что ли

а может забить на него на ворнинг - потом пофиксить?

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

Повтыкай отладочных сообщений перед каждым gtk_box_pack_start - хоть поймешь в каком именно месте косячит.

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

хороший совет вышел - нашел там hbox_main два раза пытался запаковаться =)

блин - нельзя пить пиво по рабочим дням =))

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