В Glade3 я создал главное окно и на нём кнопку butShow1. С помощью GtkBuilder я получил эти объекты и присвоил их указателям topWindow и butShow соответственно.
Вообще задача стоит сделать выпадающее меню. Но из Glade3 не получилось его добавить пока в приложении. Я создал его ручками.
// пункты меню
menu = gtk_menu_new ();
int i;
for (i = 0; i < 3; i++)
{
menu_items = gtk_menu_item_new_with_label ("123");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
gtk_widget_show (menu_items);
}
и теперь пытаюсь привязать событие clicked кнопки butShow к появлению меню. Функция button_press. Проблема в связывании сигнала
g_signal_connect_swapped (G_OBJECT (butShow), "clicked", G_CALLBACK (button_press), G_OBJECT (menu));
Во время запуска в консоле пишется следующее
(charter:3717): GLib-GObject-WARNING **: invalid (NULL) pointer instance
(charter:3717): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
ну и понятное дело меню не выпадает
вот полный код программы
#include <gtk/gtk.h>
#include <string.h>
#define UI_FILE "glade.glade"
void on_window1_destroy (GtkObject *object, gpointer user_data)
{
gtk_main_quit();
}
// обработка нажатия на кнопку и появление выдающего меню
static gint button_press( GtkWidget *widget, GdkEvent *event )
{
if (event->type == GDK_BUTTON_PRESS)
{
GdkEventButton *bevent = (GdkEventButton *) event;
gtk_menu_popup (GTK_MENU (widget), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
return TRUE;
}
return FALSE;
}
int main( int argc, char **argv )
{
GtkBuilder *builder;
GtkWidget *topWindow;
GtkButton *butShow;
GtkWidget *menu;
GtkWidget *menu_items;
GError *error = NULL;
gtk_init( &argc, &argv );
builder = gtk_builder_new();
if( ! gtk_builder_add_from_file( builder, UI_FILE, &error ) )
{
g_warning( "%s", error->message );
g_free( error );
return( 1 );
}
// пункты меню
menu = gtk_menu_new ();
int i;
for (i = 0; i < 3; i++)
{
menu_items = gtk_menu_item_new_with_label ("123");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
gtk_widget_show (menu_items);
}
topWindow = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
butShow = GTK_BUTTON(gtk_builder_get_object(builder, "butShow1"));
gtk_builder_connect_signals (builder, NULL);
g_object_unref( G_OBJECT( builder ) );
/* здесь проблема */
g_signal_connect_swapped (G_OBJECT (butShow), "clicked", G_CALLBACK (button_press), G_OBJECT (menu));
gtk_widget_show( topWindow );
gtk_main();
return( 0 );
}