День добрый, пытаюсь тут наваять виджет, наследую его от GtkEntry,добавил его на форму, но проблема в том что виджет не отображается на форме, вместо него пустое пространство, все методы я беру от родителя:
static void
gtk_button_entry_class_init(GtkButtonEntryClass * class)
{
GObjectClass * gobject_class = G_OBJECT_CLASS(class);
GtkWidgetClass * widget_class = (GtkWidgetClass*)class;
GtkObjectClass * object_class = GTK_OBJECT_CLASS(class);
parent_class = (GtkEntryClass*)g_type_class_peek_parent(class);
object_class->destroy = gtk_button_entry_destroy;
gobject_class->finalize = gtk_button_entry_finalize;
widget_class->realize = gtk_button_entry_realize;
widget_class->map = gtk_button_entry_map;
widget_class->size_request = gtk_button_entry_size_request;
widget_class->size_allocate = gtk_button_entry_size_allocate;
widget_class->expose_event = gtk_button_entry_expose;
widget_class->button_press_event = gtk_button_entry_press;
widget_class->button_release_event = gtk_button_entry_release;
}
static void
gtk_button_entry_init(GtkButtonEntry * button_entry)
{
}
GtkWidget *
gtk_button_entry_new()
{
return GTK_WIDGET(g_object_new(GTK_TYPE_BUTTON_ENTRY, NULL));
}
static void
gtk_button_entry_realize(GtkWidget * widget)
{
GTK_WIDGET_CLASS(parent_class)->realize(widget);
}
static void
gtk_button_entry_map(GtkWidget * widget)
{
GTK_WIDGET_CLASS(parent_class)->map(widget);
}
static void
gtk_button_entry_size_request(GtkWidget *widget, GtkRequisition * requisition)
{
GTK_WIDGET_CLASS(parent_class)->size_request(widget, requisition);
}
static void
gtk_button_entry_size_allocate(GtkWidget *widget, GtkAllocation * allocation)
{
GTK_WIDGET_CLASS(parent_class)->size_allocate(widget, allocation);
}
static gint
gtk_button_entry_expose(GtkWidget * widget, GdkEventExpose *event)
{
/* Draw buttons here */
return GTK_WIDGET_CLASS(parent_class)->expose_event(widget, event);
}
static void
gtk_button_entry_finalize(GObject *obj)
{
/* Free buttons here */
if (G_OBJECT_CLASS(parent_class)->finalize)
G_OBJECT_CLASS(parent_class)->finalize(obj);
}
static void
gtk_button_entry_destroy(GtkObject *obj)
{
if (GTK_OBJECT_CLASS(parent_class)->destroy)
GTK_OBJECT_CLASS(parent_class)->destroy(obj);
}
и файл теста:
int main(int argc, char *argv[]) {
GtkWidget * window;
GtkWidget * vbox;
GtkWidget * button;
GtkWidget * button_entry;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_return_val_if_fail(window != NULL, 0);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
button = gtk_button_new_with_label("TEST");
gtk_container_add(GTK_CONTAINER(vbox), button);
button_entry = gtk_button_entry_new();
gtk_widget_set_size_request(button_entry, 40, 20);
gtk_container_add(GTK_CONTAINER(vbox), button_entry);
gtk_widget_show_all(window);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(main_quit), NULL);
gtk_main();
Здесь под кнопкой у меня образуется пустое место, размером в 20 пикселей, как и установил. Если же заменить в
button_entry = gtk_button_entry_new();
на
button_entry = gtk_entry_new();