📄 testgtk.c
字号:
statusbar_steal (GtkWidget *button, GtkStatusbar *statusbar){ gtk_statusbar_remove (statusbar, 1, 4);}static voidstatusbar_popped (GtkStatusbar *statusbar, guint context_id, const gchar *text){ if (!statusbar->messages) statusbar_counter = 1;}static voidstatusbar_contexts (GtkStatusbar *statusbar){ gchar *string; string = "any context"; g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n", string, gtk_statusbar_get_context_id (statusbar, string)); string = "idle messages"; g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n", string, gtk_statusbar_get_context_id (statusbar, string)); string = "some text"; g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n", string, gtk_statusbar_get_context_id (statusbar, string)); string = "hit the mouse"; g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n", string, gtk_statusbar_get_context_id (statusbar, string)); string = "hit the mouse2"; g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n", string, gtk_statusbar_get_context_id (statusbar, string));}static voidstatusbar_dump_stack (GtkStatusbar *statusbar){ GSList *list; for (list = statusbar->messages; list; list = list->next) { GtkStatusbarMsg *msg; msg = list->data; g_print ("context_id: %d, message_id: %d, status_text: \"%s\"\n", msg->context_id, msg->message_id, msg->text); }}static voidcreate_statusbar (void){ static GtkWidget *window = NULL; GtkWidget *box1; GtkWidget *box2; GtkWidget *button; GtkWidget *separator; GtkWidget *statusbar; if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); gtk_window_set_title (GTK_WINDOW (window), "statusbar"); gtk_container_border_width (GTK_CONTAINER (window), 0); box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), box1); box2 = gtk_vbox_new (FALSE, 10); gtk_container_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); statusbar = gtk_statusbar_new (); gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0); gtk_signal_connect (GTK_OBJECT (statusbar), "text_popped", GTK_SIGNAL_FUNC (statusbar_popped), NULL); button = gtk_widget_new (gtk_button_get_type (), "label", "push something", "visible", TRUE, "parent", box2, "signal::clicked", statusbar_push, statusbar, NULL); button = gtk_widget_new (gtk_button_get_type (), "label", "pop", "visible", TRUE, "parent", box2, "signal_after::clicked", statusbar_pop, statusbar, NULL); button = gtk_widget_new (gtk_button_get_type (), "label", "steal #4", "visible", TRUE, "parent", box2, "signal_after::clicked", statusbar_steal, statusbar, NULL); button = gtk_widget_new (gtk_button_get_type (), "label", "dump stack", "visible", TRUE, "parent", box2, "object_signal::clicked", statusbar_dump_stack, statusbar, NULL); button = gtk_widget_new (gtk_button_get_type (), "label", "test contexts", "visible", TRUE, "parent", box2, "object_signal_after::clicked", statusbar_contexts, statusbar, NULL); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); box2 = gtk_vbox_new (FALSE, 10); gtk_container_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); button = gtk_button_new_with_label ("close"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT (window)); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); } if (!GTK_WIDGET_VISIBLE (window)) gtk_widget_show_all (window); else gtk_widget_destroy (window);}/* * GtkTree */static voidcb_tree_destroy_event(GtkWidget* w){ sTreeButtons* tree_buttons; /* free buttons structure associate at this tree */ tree_buttons = gtk_object_get_user_data (GTK_OBJECT (w)); g_free (tree_buttons);}static voidcb_add_new_item(GtkWidget* w, GtkTree* tree){ sTreeButtons* tree_buttons; GList* selected_list; GtkWidget* selected_item; GtkWidget* subtree; GtkWidget* item_new; char buffer[255]; tree_buttons = gtk_object_get_user_data(GTK_OBJECT(tree)); selected_list = GTK_TREE_SELECTION(tree); if(selected_list == NULL) { /* there is no item in tree */ subtree = GTK_WIDGET(tree); } else { /* list can have only one element */ selected_item = GTK_WIDGET(selected_list->data); subtree = GTK_TREE_ITEM_SUBTREE(selected_item); if(subtree == NULL) { /* current selected item have not subtree ... create it */ subtree = gtk_tree_new(); gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item), subtree); } } /* at this point, we know which subtree will be used to add new item */ /* create a new item */ sprintf(buffer, "item add %d", tree_buttons->nb_item_add); item_new = gtk_tree_item_new_with_label(buffer); gtk_tree_append(GTK_TREE(subtree), item_new); gtk_widget_show(item_new); tree_buttons->nb_item_add++;}static voidcb_remove_item(GtkWidget*w, GtkTree* tree){ GList* selected_list; GList* clear_list; selected_list = GTK_TREE_SELECTION(tree); clear_list = NULL; while (selected_list) { clear_list = g_list_prepend (clear_list, selected_list->data); selected_list = selected_list->next; } clear_list = g_list_reverse (clear_list); gtk_tree_remove_items(tree, clear_list); g_list_free (clear_list);}static voidcb_remove_subtree(GtkWidget*w, GtkTree* tree){ GList* selected_list; GtkTreeItem *item; selected_list = GTK_TREE_SELECTION(tree); if (selected_list) { item = GTK_TREE_ITEM (selected_list->data); if (item->subtree) gtk_tree_item_remove_subtree (item); }}static voidcb_tree_changed(GtkTree* tree){ sTreeButtons* tree_buttons; GList* selected_list; guint nb_selected; tree_buttons = gtk_object_get_user_data(GTK_OBJECT(tree)); selected_list = GTK_TREE_SELECTION(tree); nb_selected = g_list_length(selected_list); if(nb_selected == 0) { if(tree->children == NULL) gtk_widget_set_sensitive(tree_buttons->add_button, TRUE); else gtk_widget_set_sensitive(tree_buttons->add_button, FALSE); gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE); gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE); } else { gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE); gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1)); gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1)); } }static void create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max){ GtkWidget* item_subtree; GtkWidget* item_new; guint nb_item; char buffer[255]; int no_root_item; if(level == recursion_level_max) return; if(level == -1) { /* query with no root item */ level = 0; item_subtree = item; no_root_item = 1; } else { /* query with no root item */ /* create subtree and associate it with current item */ item_subtree = gtk_tree_new(); no_root_item = 0; } for(nb_item = 0; nb_item < nb_item_max; nb_item++) { sprintf(buffer, "item %d-%d", level, nb_item); item_new = gtk_tree_item_new_with_label(buffer); gtk_tree_append(GTK_TREE(item_subtree), item_new); create_subtree(item_new, level+1, nb_item_max, recursion_level_max); gtk_widget_show(item_new); } if(!no_root_item) gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);}static voidcreate_tree_sample(guint selection_mode, guint draw_line, guint view_line, guint no_root_item, guint nb_item_max, guint recursion_level_max) { GtkWidget* window; GtkWidget* box1; GtkWidget* box2; GtkWidget* separator; GtkWidget* button; GtkWidget* scrolled_win; GtkWidget* root_tree; GtkWidget* root_item; sTreeButtons* tree_buttons; /* create tree buttons struct */ if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL) { g_error("can't allocate memory for tree structure !\n"); return; } tree_buttons->nb_item_add = 0; /* create top level window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Tree Sample"); gtk_signal_connect(GTK_OBJECT(window), "destroy", (GtkSignalFunc) cb_tree_destroy_event, NULL); gtk_object_set_user_data(GTK_OBJECT(window), tree_buttons); box1 = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), box1); gtk_widget_show(box1); /* create tree box */ box2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0); gtk_container_border_width(GTK_CONTAINER(box2), 5); gtk_widget_show(box2); /* create scrolled window */ scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0); gtk_widget_set_usize (scrolled_win, 200, 200); gtk_widget_show (scrolled_win); /* create root tree widget */ root_tree = gtk_tree_new(); gtk_signal_connect(GTK_OBJECT(root_tree), "selection_changed", (GtkSignalFunc)cb_tree_changed, (gpointer)NULL); gtk_object_set_user_data(GTK_OBJECT(root_tree), tree_buttons); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree); gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode); gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line); gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line); gtk_widget_show(root_tree); if ( no_root_item ) { /* set root tree to subtree function with root item variable */ root_item = GTK_WIDGET(root_tree); } else { /* create root tree item widget */ root_item = gtk_tree_item_new_with_label("root item"); gtk_tree_append(GTK_TREE(root_tree), root_item); gtk_widget_show(root_item); } create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max); box2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0); gtk_container_border_width(GTK_CONTAINER(box2), 5); gtk_widget_show(box2); button = gtk_button_new_with_label("Add Item"); gtk_widget_set_sensitive(button, FALSE); gtk_signal_connect(GTK_OBJECT (button), "clicked", (GtkSignalFunc) cb_add_new_item, (gpointer)root_tree); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); tree_buttons->add_button = button; button = gtk_button_new_with_label("Remove Item(s)"); gtk_widget_set_sensitive(button, FALSE); gtk_signal_connect(GTK_OBJECT (button), "clicked", (GtkSignalFunc) cb_remove_item, (gpointer)root_tree); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); tree_buttons->remove_button = button; button = gtk_button_new_with_label("Remove Subtree"); gtk_widget_set_sensitive(button, FALSE); gtk_signal_connect(GTK_OBJECT (button), "clicked", (GtkSignalFunc) cb_remove_subtree, (gpointer)root_tree); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); tree_buttons->subtree_button = button;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -