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

📄 gnomeapp_ui.c

📁 《Beginning Linux Programming》书的配置实例源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* GNOME front end to the CD database    developed in Beginning Linux Programming 2nd edition */#include <gnome.h>#include <stdlib.h>#include <stdio.h>#include "cd_data.h"/* define local prototypes */ static void update_clist(void);static void add_cd_dialog(void);static void delete_cd_dialog(void);static void add_track_dialog(void);static void delete_track_dialog(void);static void find_cat_entry(void);static gint get_row(gchar *catalog);static void update_track_list(void);static gint count_track_entries(void);static void create_main_window(void);static void set_insensitive(void);static void show_about_dialog(void);/* define global variables - a data structure would be better */GtkWidget *cd_list;GtkWidget *track_list;GtkWidget *track_frame;cdc_entry selected_cdc_entry;gint selected_track;/* Menu and toolbar definitions */GnomeUIInfo file_menu[] = {	GNOMEUIINFO_MENU_EXIT_ITEM(gtk_main_quit, NULL),	GNOMEUIINFO_END};GnomeUIInfo edit_menu[] = {	GNOMEUIINFO_MENU_FIND_ITEM(find_cat_entry, NULL),	GNOMEUIINFO_END};GnomeUIInfo help_menu[] = {	GNOMEUIINFO_MENU_ABOUT_ITEM(show_about_dialog, NULL),	GNOMEUIINFO_END};GnomeUIInfo menubar[] = {	GNOMEUIINFO_MENU_FILE_TREE(file_menu),	GNOMEUIINFO_MENU_EDIT_TREE(edit_menu),	GNOMEUIINFO_MENU_HELP_TREE(help_menu),	GNOMEUIINFO_END};GnomeUIInfo toolbar[] = {	GNOMEUIINFO_ITEM_STOCK("New", "Add a Cd",						add_cd_dialog,						GNOME_STOCK_PIXMAP_CDROM),	GNOMEUIINFO_ITEM_STOCK("Delete", "Delete a Cd",						delete_cd_dialog,						GNOME_STOCK_PIXMAP_CLOSE),	GNOMEUIINFO_ITEM_STOCK("Find", "Find a Cd",					find_cat_entry,					GNOME_STOCK_PIXMAP_SEARCH),	GNOMEUIINFO_SEPARATOR,		GNOMEUIINFO_ITEM_STOCK("Exit", "Exit the application",					gtk_main_quit,					GNOME_STOCK_PIXMAP_EXIT),	GNOMEUIINFO_END};static void show_about_dialog(){    GtkWidget *about;    const gchar *authors[] = { "Wrox Press et al", NULL};        about = gnome_about_new("CD Database", "0.1",			    "GNU Public License",			    authors,			    "The GNOME front end to the CD Database developed in 'Beginning Linux Programming 2nd edition'",			    NULL);    gtk_widget_show(about);}static void select_row_callback(GtkWidget *cd_list, 					gint row,					gint column,					GdkEventButton *event,					gpointer data){	    gchar *row_text;    gtk_widget_set_sensitive(track_frame, TRUE); /* unshade the track frame */    gtk_clist_get_text (GTK_CLIST (cd_list), row, 0, &row_text); /* get the catalog of the selected cd */    selected_cdc_entry = get_cdc_entry(row_text); /* update our global variable */    update_track_list(); /* redraw the track list to show the tracks for the selected cd */}	static void update_track_list () /* redraw the track list based on the currently selected cd */{    gchar *text[2];    cdt_entry entry_found;    gint track_no = 1;    gchar buffer[70];	    gtk_clist_clear (GTK_CLIST (track_list)); /* clear the track list */    text[0] = buffer;			    do {	entry_found = get_cdt_entry(selected_cdc_entry.catalog, track_no);	if (entry_found.catalog[0]) {	    sprintf(text[0], "%d", entry_found.track_no); /* place the track number in the first column */	    text[1] = entry_found.track_txt; /* place the track text in the second column */	    gtk_clist_append (GTK_CLIST(track_list), text);   /* add the row */	    track_no++; /* do the next track */	}    } while (entry_found.catalog[0]); }	void select_track_row_callback(GtkWidget *cd_list,				   gint row,				   gint column,				   GdkEventButton *event,				   gpointer data){			selected_track = row + 1; /* update the selected track global variable */				  /* rows start from zero, so add one to get the track number */}	static void update_clist() /* update the cd list */{    cdc_entry item_found;    gint first_call = 1;    gchar *text[4];    gchar *null_text = ""; /* we get all the cds from the database by searching for a null string */    gint row;   	    gtk_clist_clear (GTK_CLIST (cd_list)); /* clear the list */  	    item_found = search_cdc_entry(null_text, &first_call);    while (item_found.catalog[0] != '\0') { /* add cds row by row */	    text[0] = item_found.catalog;	    text[1] = item_found.title;	    text[2] = item_found.type;	    text[3] = item_found.artist;		    row = gtk_clist_append (GTK_CLIST(cd_list), text); 	    item_found = search_cdc_entry(null_text, &first_call);    }    gtk_clist_sort(GTK_CLIST(cd_list)); }	 	static void add_cd_dialog(){    GtkWidget *dialog;    GtkWidget *label;    GtkWidget *hbox;    GtkWidget *catalog, *title, *type, *artist;    cdc_entry new_entry;    gint i;	    memset(&new_entry ,'\0', sizeof(new_entry));    dialog = gnome_dialog_new("Add new CD",		 GNOME_STOCK_BUTTON_OK,		 GNOME_STOCK_BUTTON_CLOSE,		 NULL);    hbox = gtk_hbox_new (FALSE, 0);    label = gtk_label_new ("Catalog Entry: ");    catalog = 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), catalog, 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 ("Title: ");    title = gtk_entry_new_with_max_length (CAT_TITLE_LEN);    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (hbox), title, 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 ("Type: ");    type = gtk_entry_new_with_max_length (CAT_TYPE_LEN);    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (hbox), type, 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 ("Artist: ");    artist = gtk_entry_new_with_max_length (CAT_ARTIST_LEN);    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);    gtk_box_pack_start (GTK_BOX (hbox), artist, 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) { 	strncpy(new_entry.catalog, gtk_entry_get_text (GTK_ENTRY (catalog)), CAT_CAT_LEN - 1); 	strncpy(new_entry.title, gtk_entry_get_text (GTK_ENTRY(title)), CAT_TITLE_LEN - 1); 	strncpy(new_entry.type, gtk_entry_get_text (GTK_ENTRY(type)), CAT_TYPE_LEN - 1);    	strncpy(new_entry.artist, gtk_entry_get_text (GTK_ENTRY(artist)), CAT_ARTIST_LEN - 1);    	    	add_cdc_entry(new_entry);    	update_clist();    }    gnome_dialog_close (GNOME_DIALOG (dialog));    }static void delete_cd_dialog()  {    GtkWidget *dialog;    gint track_no = 1;    gint i;    gint delete_ok;	    dialog = gnome_message_box_new ("Are you sure you want to delete this entry and all its 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) {	 do {	      delete_ok = del_cdt_entry(selected_cdc_entry.catalog, track_no);	      track_no++;	 } while (delete_ok);	 del_cdc_entry(selected_cdc_entry.catalog);	 update_clist();	 gtk_clist_clear (GTK_CLIST (track_list));	 set_insensitive();	     }}static void add_track_dialog(){    GtkWidget *dialog;    GtkWidget *label;    GtkWidget *hbox;    GtkWidget *spin_button, *description;    GtkObject *spinner_adj;    cdt_entry new_track;    gint next_track;    gint i;        memset(&new_track, '\0', sizeof(new_track));	    dialog = gnome_dialog_new("Add a track",		 GNOME_STOCK_BUTTON_OK,		 GNOME_STOCK_BUTTON_CLOSE,		 NULL);    next_track = count_track_entries() + 1; /* we count the number of tracks for this cd      */					    /* so we can only add a track with a track number */					    /* 1 greater than the current number of tracks    */	    spinner_adj = gtk_adjustment_new((gfloat) (next_track), 1.0, (gfloat) (next_track), 1.0, 1.0, 1.0);	    hbox = gtk_hbox_new (FALSE, 2);    label = gtk_label_new ("Track number: ");	    spin_button = gtk_spin_button_new (GTK_ADJUSTMENT (spinner_adj), 1.0, 0.0);    gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin_button), TRUE);	

⌨️ 快捷键说明

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