Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), "Username", username_entry); add_widget_with_label(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), "Password", password_entry); gtk_widget_show_all(GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); return dialog;}Файл callbacks.с содержит функции, задающие обратные вызовы для виджетов пользовательского интерфейса.
1. Сначала необходимо включить заголовочный файл и ссылки на некоторые определенные в файле interface.c глобальные переменные для чтения и изменения конкретных свойств виджетов:
#include "app_gnome.h"extern GtkWidget *treeview;extern GtkWidget *app;extern GtkWidget *appbar;extern GtkWidget *artist_entry;extern GtkWidget *title_entry;extern GtkWidget *catalogue_entry;static GtkWidget *addcd_dialog;2. В функции
quit_appdatabase_endvoid quit_app(GtkWidget* window, gpointer data) { database_end(); gtk_main_quit();}3. Следующая функция выводит простое диалоговое окно для подтверждения вашего желания завершить приложение, возвращая отклик в виде значения
gbooleangboolean confirm_exit() { gint result; GtkWidget* dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Are you sure you want to quit?"); result = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return (result == GTK_RESPONSE_YES);}4.
delete_event_handlerGdk delete eventgboolean delete_event_handler(GtkWidget* window, GdkEvent *event, gpointer data) { return !confirm_exit();}5. Следующая функция вызывается, когда мышью щелкается кнопка в диалоговом окне вставки компакт-диска. Если вы щелкнули мышью кнопку OK, программа копирует строки в массив типа char и передает его данные в интерфейсную функцию MySQL add_cd:
void addcd_dialog_button_clicked(GtkDialog * dialog, gint response, gpointer userdata) { const gchar *artist_const; const gchar* title_const; const gchar *catalogue_const; gchar artist[200]; gchar title[200]; gchar catalogue[200]; gint *cd_id; if (response == GTK_RESPONSE_ACCEPT) { artist_const = gtk_entry_get_text(GTK_ENTRY(artist_entry)); title_const = gtk_entry_get_text(GTK_ENTRY(title_entry)); catalogue_const = gtk_entry_get_text(GTK_ENTRY(catalogue_entry)); strcpy(artist, artist_const); strcpy(title, title_const); strcpy(catalogue, catalogue_const); add_cd(artist, title, catalogue, cd_id); } addcd_dialog = NULL; gtk_widget_destroy(GTK_WIDGET(dialog));}6. Далее идет самая важная часть приложения: извлечение результатов поиска и заполнение объекта
GtkTreeViewvoid on_search_button_clicked(GtkButton* button, gpointer userdata) { struct cd_search_st cd_res; struct current_cd_st cd; struct current_tracks_st ct; gint res1, res2, res3; gchar track_title[110]; const gchar *search_string_const; gchar search string[200]; gchar search_text[200]; gint i = 0, j = 0; GtkTreeStore *tree_store; GtkTreeIter parent_iter, child_iter; memset(&track_title, 0, sizeof(track_title));7. Здесь вы получаете строку поиска из виджета ввода, копируете ее в переменную и выбираете соответствующие ID компакт-дисков:
search_string_const = gtk_entry_get_text(GTK_ENTRY(userdata)); strcpy(search_string, search_string_const); resl = find_cds(search_string, &cd_res);8. Затем вы обновляете
appbar sprintf(search_text, "Displaying %d result(s) for search string ' %s'", MIN(res1, MAX_CD_RESULT), search_string); gnome_appbar_push(GNOME_APPBAR(appbar), search_text);9. Теперь у вас есть результаты поиска, и можно заполнять ими модель
GtkTreeStorecurrent_cd_stMAX_CD_RESULTGtkTreeStore