⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gnomeapp_ui.c

📁 《Beginning Linux Programming》书的配置实例源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
	    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (hbox), spin_button, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);    hbox = gtk_hbox_new (FALSE, 0);    label = gtk_label_new ("Description: ");    description = gtk_entry_new_with_max_length (CAT_TITLE_LEN);    gtk_box_pack_end (GTK_BOX (hbox), description, FALSE, FALSE, 0);    gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);    gtk_widget_show_all (dialog);    i = gnome_dialog_run(GNOME_DIALOG (dialog));     if (i==0) { /* i==0 when we click ok, so here we add the new track */	new_track.track_no = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON (spin_button));						strncpy(new_track.track_txt, gtk_entry_get_text (GTK_ENTRY (description)), TRACK_TTEXT_LEN - 1);	strcpy(new_track.catalog, selected_cdc_entry.catalog);	add_cdt_entry(new_track);	     }	    gnome_dialog_close(GNOME_DIALOG (dialog)); /* close the dialog */     update_track_list();  /* and update the track list to show the new addition */}	static void delete_track_dialog(){    GtkWidget *dialog;    gint i; 	    dialog = gnome_message_box_new ("Are you sure you want to delete this track and all the higher numbered tracks?",								GNOME_MESSAGE_BOX_QUESTION,								GNOME_STOCK_BUTTON_YES,								GNOME_STOCK_BUTTON_CANCEL,								NULL);    gtk_widget_show_all (dialog);    i = gnome_dialog_run(GNOME_DIALOG (dialog));    if (i==0) {	while (del_cdt_entry(selected_cdc_entry.catalog, selected_track)) {  	selected_track++;	}	update_track_list();	 /* we must delete all higher numbered tracks than the one we select to delete, to ensure */	 /* that row 'n' contains track 'n+1', which our update functions etc rely on             */		    }}static void reorder_list (GtkCList *clist, gint column, gpointer data){	    gtk_clist_sort(GTK_CLIST(clist)); /* when we click on a column header in the cd list, we reorder*/				      /* in ascending alphabetical order for that column            */		    gtk_clist_set_sort_column(GTK_CLIST(clist), column);	}static gint count_track_entries() /* calculate the total number of tracks for the currently selected cd */{    cdt_entry cdt_found;    gint track_entries_found = 0;    gint track_no = 1;        do {	cdt_found = get_cdt_entry(selected_cdc_entry.catalog, track_no);	if (cdt_found.catalog[0]) {	    track_entries_found++;	    track_no++;	}    }    while (cdt_found.catalog[0]);    return (track_entries_found);}static void find_cat_entry(void) /* search for a catalog entry                                         */{				 /* first we search the database, then we find the entry in our list   */				 /* because the list may have been reordered since we created the list */				 /* This way, we don't have to keep track of which row each cd is in   */    cdc_entry item_found;    GtkWidget *dialog;    GtkWidget *label;    GtkWidget *search_entry;    GtkWidget *hbox;    gint i;    gint first_call = 1;	    dialog = gnome_dialog_new("Search",		 GNOME_STOCK_BUTTON_OK,		 GNOME_STOCK_BUTTON_CLOSE,		 NULL);    hbox = gtk_hbox_new (FALSE, 0);    label = gtk_label_new ("Search for catalog entry: ");    search_entry = gtk_entry_new_with_max_length (CAT_CAT_LEN);	 	    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (hbox), search_entry, FALSE, FALSE, 0);	     gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);    gtk_widget_show_all (dialog);    i = gnome_dialog_run(GNOME_DIALOG (dialog));     if (i==0) {	item_found = search_cdc_entry(gtk_entry_get_text (GTK_ENTRY (search_entry)), &first_call);	if (item_found.catalog[0] != '\0') { 	    gtk_clist_select_row(GTK_CLIST (cd_list), get_row(item_found.catalog),0); /* select the found entry */	    gtk_clist_moveto(GTK_CLIST (cd_list), get_row(item_found.catalog), 0, 0.5, 0.5); /* move to the entry */	}    }    gnome_dialog_close(GNOME_DIALOG (dialog));   }	static gint get_row(gchar *catalog) /* find which row a particular entry is in, returning the row number */{    gint row;    gchar *row_text;        for (row = 0; row <= 9999; row++) {	 gtk_clist_get_text (GTK_CLIST (cd_list), row, 0, &row_text);	 if (strcmp(row_text, catalog)==0) {	     break;	 }    }    return row;} static void set_insensitive() /* when we unselect a cd, make sure we can't add or delete a track */			      /* by shading the entire frame */{gtk_widget_set_sensitive(track_frame, FALSE);}static void create_main_window() /* function that creates the main window */{    GtkWidget *hbox;    GtkWidget *vbox, *vbox2;    GtkWidget *scrolled_window;    GtkWidget *scrolled_window2;    GtkWidget *add_button, *delete_button;    GtkWidget *app;        gchar     *titles[4] = {"Catalog Entry", "Title", "Type", "Artist"}; /* cd list column titles */    gchar     *tracks[2] = {"Track no.","Title"}; /* track list column titles */        app = gnome_app_new ("example", "CD Database");        hbox = gtk_hbox_new (FALSE, 0);    vbox = gtk_vbox_new (FALSE, 0);    vbox2 = gtk_vbox_new (FALSE, 0);    cd_list = gtk_clist_new_with_titles (4, titles);    track_list = gtk_clist_new_with_titles (2, tracks);		    gtk_clist_set_column_width(GTK_CLIST(cd_list), 1, 200); /* set sensible column widths */    gtk_clist_set_column_width(GTK_CLIST(cd_list), 2, 50);    gtk_clist_set_column_width(GTK_CLIST(cd_list), 3, 100);	    gtk_clist_set_column_justification (GTK_CLIST(cd_list), 0, GTK_JUSTIFY_CENTER); /* justify leftmost column */    gtk_clist_set_column_justification (GTK_CLIST(track_list), 0, GTK_JUSTIFY_CENTER);	    gtk_clist_set_sort_type(GTK_CLIST(cd_list), GTK_SORT_ASCENDING); /* sort rows in ascending alphabetical order */    gtk_clist_set_sort_type(GTK_CLIST(track_list), GTK_SORT_ASCENDING);    gtk_clist_set_sort_column(GTK_CLIST(cd_list), 0);    gtk_clist_set_sort_column(GTK_CLIST(track_list), 0);    gtk_clist_column_titles_passive (GTK_CLIST (track_list)); /* set the track list column titles passive, */							      /* to show we can't click on them */	    scrolled_window = gtk_scrolled_window_new (NULL, NULL); /* create scrolled window widgets to place the clists in */    scrolled_window2 = gtk_scrolled_window_new (NULL, NULL);	    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),				    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* select scrollbar policy to show          */    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2),  /* a vertical scrollbar only when necessary */				    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);       track_frame = gtk_frame_new("Tracks"); /* create the frame to hold the track list and buttons */    add_button = gtk_button_new_with_label("Add..."); /* create the add track button */    delete_button = gtk_button_new_with_label("Delete"); /* create the delete track button */	    gtk_box_pack_start(GTK_BOX(hbox), add_button, FALSE, FALSE, 0);     gtk_box_pack_start(GTK_BOX(hbox), delete_button, FALSE, FALSE, 0);	    gtk_container_add(GTK_CONTAINER(scrolled_window), cd_list);			   							       gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);		    gtk_container_add(GTK_CONTAINER(scrolled_window2), track_list);    gtk_box_pack_start(GTK_BOX(vbox2), scrolled_window2, TRUE, TRUE, 0);    gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);    gtk_container_add(GTK_CONTAINER(track_frame), vbox2);    gtk_box_pack_start(GTK_BOX(vbox), track_frame, TRUE, TRUE, 0);        gtk_container_border_width(GTK_CONTAINER (vbox), 10);    gnome_app_create_menus (GNOME_APP (app), menubar);    gnome_app_create_toolbar (GNOME_APP (app), toolbar);		    gnome_app_set_contents(GNOME_APP(app), vbox);        /* add our callbacks */    gtk_signal_connect (GTK_OBJECT (app), "delete_event",                        GTK_SIGNAL_FUNC (gtk_main_quit),                        NULL);			         gtk_signal_connect(GTK_OBJECT (cd_list), 		       "select_row",		       GTK_SIGNAL_FUNC(select_row_callback),		       NULL);				       gtk_signal_connect(GTK_OBJECT (track_list),		       "select_row",		       GTK_SIGNAL_FUNC(select_track_row_callback),		       NULL);				    gtk_signal_connect(GTK_OBJECT (cd_list), /* when a column title is clicked, reorder the list */		       "click-column",		       GTK_SIGNAL_FUNC(reorder_list),		       NULL);		           gtk_signal_connect(GTK_OBJECT (cd_list), /* when a cd is unselected, shade the track frame */		       "unselect_row",		       GTK_SIGNAL_FUNC(set_insensitive),		       NULL);    /* add the button functionality */    	    gtk_signal_connect (GTK_OBJECT (add_button), 			"clicked",			GTK_SIGNAL_FUNC (add_track_dialog),			NULL);	    gtk_signal_connect(GTK_OBJECT (delete_button),		       "clicked",		       GTK_SIGNAL_FUNC (delete_track_dialog), 		       NULL);				        set_insensitive();    gtk_widget_show_all (app);}    int main(int argc, char *argv[]){     GtkWidget *dialog, *error_dialog;    gint i;		    gnome_init ("example", "0.1", argc, argv);       if (!database_initialize(0)) {		dialog = gnome_message_box_new ("Sorry, unable to initialize database\nCreate new database?",					GNOME_MESSAGE_BOX_QUESTION,					GNOME_STOCK_BUTTON_YES,					GNOME_STOCK_BUTTON_CANCEL,					NULL);	gtk_widget_show_all(dialog);	i = gnome_dialog_run(GNOME_DIALOG (dialog));	if (i==0) {	    if (!database_initialize(1)) {		error_dialog = gnome_message_box_new ("Failed to initialize database",						      GNOME_MESSAGE_BOX_ERROR,						      GNOME_STOCK_BUTTON_OK,						      NULL);		gtk_widget_show_all(error_dialog);		return 0;	    }	}	else return 0;    }						      	        create_main_window();    update_clist();      gtk_main ();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -