Основы программирования в Linux
Шрифт:
tree_store = gtk_tree_store_new(N_COLUMNS,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
while (i < res1 && i < MAX_CD_RESULT) {
res2 = get_cd(cd_res.cd_id[i], &cd);
/* В модель вставляется новая строка */
gtk_tree_store_append(tree_store, &parent_iter, NULL);
gtk_tree_store_set(tree_store, &parent_iter, COLUMN_TITLE,
cd.title, COLUMN_ARTIST, cd.artist_name, COLUMN_CATALOGUE,
cd.catalogue, -1);
res3 = get_cd_tracks(cd_res.cd_id[i++], &ct);
j = 0;
/* Заполнение дерева дорожками текущего компакт-диска */
while (j < res3) {
sprintf(track_title, " Track %d. ", j+1);
strcat(track_title, ct.track[j++]);
gtk_tree_store_append(tree_store, &child_iter, &parent_iter);
gtk_tree_store_set(tree_store, &child_iter,
COLUMN_TITLE, track_title, -1);
}
}
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),
GTK_TREE_MODEL(tree_store));
}
10. Диалоговое окно
addcd
немодальное. Следовательно, перед его созданием и отображением вы проверяете, не активно ли оно уже:
void on_addcd_activate(GtkMenuItem* menuitem, gpointer user_data) {
if (addcd_dialog != NULL) return;
addcd_dialog = create_addcd_dialog;
gtk_widget_show_all(addcd_dialog);
}
gboolean close_app(GtkWidget * window, gpointer data) {
gboolean exit;
if ((exit = confirm_exit)) {
quit_app(NULL, NULL);
}
return exit;
}
11. Когда вы щелкаете мышью кнопку About (О программе), раскрывается стандартное поле
about
среды GNOME:
void on_about_activate(GtkMenuItem* menuitem, gpointer user_data) {
const char* authors[] = {"Wrox Press", NULL};
GtkWidget* about = gnome_about_new("CD Database", "1.0",
" (c) Wrox Press", "Beginning Linux Programming",
(const char **)authors, NULL, "Translators", NULL);
gtk_widget_show(about);
}
Упражнение 16.14. Файл main.c
Введите следующий программный код в файл main.с, содержащий функцию
main
программы. 1. После операторов
include
вы ссылаетесь на поля ввода имени пользователя и пароля из файла interface.c:
#include <stdio.h>
#include <stdlib.h>
#include "app_gnome.h"
extern GtkWidget* username_entry;
extern GtkWidget* password_entry;
gint main(gint argc, gchar *argv[]) {
GtkWidget *main_window;
GtkWidget *login_dialog;
const char *user_const;
const char *pass_const;
gchar username[100];
gchar password[100];
gint result;
2. Инициализируйте как обычно библиотеки GNOME и затем создайте и отобразите на экране главное окно и диалоговое окно вашей регистрации:
gnome_program_init("CdDatabase", "0.1", LIBGNOMEUI_MODULE, argc, argv,
GNOME_PARAM_APP_DATADIR, "", NULL);
main_window = create_main_window;
gtk_widget_show_all(main_window);
login_dialog = create_login_dialog;
3. Вы ждете в цикле, пока пользователь не введет корректную комбинацию имени пользователя и пароля. Он может выйти из приложения, щелкнув мышью кнопку Cancel, причем в этом случае ему придется подтвердить свое действие:
while (1) {
result = gtk_dialog_run(GTK_DIALOG(login_dialog));
if (result != GTK_RESPONSE_ACCEPT) {
if (confirm_exit) return 0;
else continue;
}
user_const = gtk_entry_get_text(GTK_ENTRY(username_entry));
pass_const = gtk_entry_get_text(GTK_ENTRY(password_entry));
strcpy(username, user_const);
strcpy(password, pass_const);
if (database_start(username, password) == TRUE) break;
4. Если функция
database_start
завершается аварийно, вы выводите сообщение и диалоговое окно регистрации снова отображается на экране:
GtkWidget* error_dialog =
gtk_message_dialog_new(GTK_WINDOW(main_window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
Поделиться:
Популярные книги
Моров. Том 5
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Треск штанов
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще граф. Книга #8
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Династия. Феникс
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Чужак из ниоткуда 5
5. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 29
29. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Гранит науки. Том 3
3. Героями не становятся, ими умирают
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Двойник Короля 10
10. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 6
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ищу жену с прицепом
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Deus vult
9. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Спасите меня, Кацураги-сан!
1. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
5.00
рейтинг книги
Меченный смертью. Том 1
1. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00