gtk+について
Posted: 2011年12月08日(木) 00:15
Gtk+でメニューバーを作成してみたのですが、
どうも、実行時にエラーが出ます。
ソースはいかのとおりです。
エラーはこのようになっています。
(a.out:5302): Gtk-CRITICAL **: gtk_box_pack: assertion `child->parent == NULL' failed
gtk+についてはよく分からないので、分かる方は教えてください。
どうも、実行時にエラーが出ます。
ソースはいかのとおりです。
#include <gtk/gtk.h>
static GtkActionEntry entries[] = {
{"FileMenu", NULL, "_File"},
{"EditMenu", NULL, "_Edit"},
{"ViewMenu", NULL, "_View"},
{"SortMenu", GTK_STOCK_SORT_ASCENDING, "Sort by ..."},
{"New", NULL, "_New", "<control>N", "Create a new file", NULL},
{"Open", NULL, "_Open", "<control>O", "Open a file", NULL},
{"Save", NULL, "_Save", "<control>S", "Save a file", NULL},
{"SaveAs", NULL, "Save as", "<shift><control>S", NULL, NULL},
{"Quit", NULL, "_Quit", "<control>Q", "QuitÃaÃprogram" ,gtk_main_quit},
{"Cut", GTK_STOCK_CUT, "C_ut", "<control>X", NULL, NULL},
{"Copy" , GTK_STOCK_COPY, "_Copy", "<control>C", NULL, NULL},
{"Paste" , GTK_STOCK_PASTE, "_Paste", "<control>V" , NULL, NULL},
{"Delete" , GTK_STOCK_DELETE, "_Delete", "<control>D", NULL, NULL}
};
static GtkToggleActionEntry toggle_entries[] = {
{"ShowHidden", NULL, "Show Hidden Folders", "<control>H",
NULL, NULL, FALSE}
};
enum {
SORT_FILE_TYPE,
SORT_FILE_SIZE,
SORT_UPDATE_TIME,
};
static GtkRadioActionEntry radio_entries[] = {
{"FileType", NULL, "File Type", NULL, NULL, SORT_FILE_TYPE },
{"FileSize", NULL, "File Size", NULL, NULL, SORT_FILE_SIZE },
{"UpdateTime", NULL, "Update Time", NULL, NULL, SORT_UPDATE_TIME }
};
static guint n_entries = G_N_ELEMENTS(entries);
static guint n_toggle_entries = G_N_ELEMENTS(toggle_entries);
static guint n_radio_entries = G_N_ELEMENTS(radio_entries);
static const gchar *ui_info =
"<ui>"
" <menubar name='MenuBar'>"
" <menu action='FileMenu'>"
" <menuitem action='New' />"
" <menuitem action='Open'/>"
" <menuitem action='Save'/>"
" <menuitem action='SaveAs' />"
" <separator/>"
" <menuitem action='Quit' />"
" </menu>"
" <menu action='EditMenu'>"
" <menuitem action='Cut' />"
" <menuitem action='Copy' />"
" <menuitem action='Paste' />"
" <menuitem action='Delete'/>"
" </menu>"
" <menu action='ViewMenu'>"
" <menuitem action='ShowHidden'/>"
" <menu action='SortMenu'>"
" <menuitem action='FileType'/>"
" <menuitem action='FileSize'/>"
" <menuitem action='UpdateTime'/>"
" </menu>"
" </menu>"
" </menubar>"
"</ui>";
static void activate_radio_action(GtkAction *action,
GtkRadioAction *current){
g_print("Radio action \"%s\" selected\n",
gtk_action_get_name(GTK_ACTION(current)));
}
static GtkWidget *create_menu(GtkWidget *parent){
GtkUIManager *ui;
GtkActionGroup *actions;
actions = gtk_action_group_new("Actions");
gtk_action_group_add_actions(actions, entries, n_entries, NULL);
gtk_action_group_add_toggle_actions(actions, toggle_entries,
n_toggle_entries, NULL);
gtk_action_group_add_radio_actions(actions, radio_entries,
n_radio_entries,SORT_FILE_TYPE,
G_CALLBACK(activate_radio_action), NULL);
ui = gtk_ui_manager_new();
gtk_ui_manager_insert_action_group(ui, actions, 0);
gtk_ui_manager_set_add_tearoffs(ui, TRUE);
gtk_window_add_accel_group(GTK_WINDOW(parent),
gtk_ui_manager_get_accel_group(ui));
gtk_ui_manager_add_ui_from_string(ui, ui_info, -1, NULL);
return gtk_ui_manager_get_widget(ui, "/MenuBar");
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *menubar;
GtkWidget *lunch, *lunchmenu,*vbox;
GtkWidget *menu1, *menu2, *menu3;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Tinytole Terminal");
gtk_widget_set_size_request(window, 580 , 370);
gtk_container_set_border_width(GTK_CONTAINER(window), 0);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
vbox = gtk_vbox_new(FALSE, 0);
menubar = create_menu(window);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), menubar, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
(a.out:5302): Gtk-CRITICAL **: gtk_box_pack: assertion `child->parent == NULL' failed
gtk+についてはよく分からないので、分かる方は教えてください。