Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 184

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

 gtk_widget_show_all(GTK_WIDGET(GTK_DIALOG(dialog)->vbox));

 return dialog;

}

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.13. callbacks.c

Π€Π°ΠΉΠ» 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_app Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ database_end для чистки ΠΈ закрытия Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ:

void quit_app(GtkWidget* window, gpointer data) {

 database_end();

 gtk_main_quit();

}

3. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ простоС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для подтвСрТдСния вашСго ТСлания Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, возвращая ΠΎΡ‚ΠΊΠ»ΠΈΠΊ Π² Π²ΠΈΠ΄Π΅ значСния gboolean:

gboolean 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_handler β€” функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ связываСтС с событиСм Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Gdk delete event. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ гСнСрируСтся, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ (Ρ‡Ρ‚ΠΎ сущСствСнно), ΠΊΠ°ΠΊ послан сигнал GTK+ уничтоТСния ΠΎΠΊΠ½Π°:

gboolean 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. Π”Π°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ‚ самая ваТная Ρ‡Π°ΡΡ‚ΡŒ прилоТСния: ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkTreeView:

void 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. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΠΌΠΈ модСль GtkTreeStore. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ID ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ структуру Ρ‚ΠΈΠΏΠ° current_cd_st, которая содСрТит Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ исполнитСля CD, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ список Π΄ΠΎΡ€ΠΎΠΆΠ΅ΠΊ диска. Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ app_mysql.h Π·Π°Π΄Π°Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства элСмСнтов, MAX_CD_RESULT, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ пСрСполнСния ΠΌΠΎΠ΄Π΅Π»ΠΈ GtkTreeStore:

 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,

    "Could not log on! β€” Check Username and Password");

  gtk_dialog_run(GTK_DIALOG(error_dialog));

  gtk_widget_destroy(error_dialog);

 }

 gtk_widget_destroy(login_dialog);

 gtk_main();

 return 0;

}

5. Π”ля компиляции этого прилоТСния Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ make-Ρ„Π°ΠΉΠ». Как ΠΈ Π² Π³Π»Π°Π²Π΅ 8, Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, придСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ мСсто располоТСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ mysql-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ строки, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π΄Π°Π»Π΅Π΅:

-L/usr/lib/mysql

ПослС ΠΎΠΏΡ†ΠΈΠΈ -L помСститС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ваша систСма Ρ…Ρ€Π°Π½ΠΈΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ MySQL:

all: app


app: app_mysql.c callbacks.с interface.c main.с app_gnome.h app_mysql.h

 gcc -o app -I/usr/include/mysql app_mysql.с callbacks.с interface.c main.с -lmysqlclient `pkg-config --cflags --libs libgnome-2.0 libgnomeui-2.0`


clean:

 rm -f app

6. Π’Π΅ΠΏΠ΅Ρ€ΡŒ для компиляции прилоТСния для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисками просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ make:

make -f Makefile

Когда Π²Ρ‹ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°Ρ€Ρ€, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков Π² стилС GNOME (рис. 16.15)!

Рис. 16.15