Archive for the 'Розробка софту' Category

Справа зовсім не в ліцензіях, а в тобі

субота, Квітень 11th, 2009

Я ненавиджу ліцензії на програмне забезпечення. І зовсім не тому, що вони обмежують мою свободу, і бла-бла-бла. Річ у тім, що в більшості випадків ліцензії використовують морально та інтелектуально недорозвинені програмісти, які через свої хибні уявлення про життя просто не доросли до правильного розуміння цих речей.

The contents of your online communications, as well as other information about you as an ICQ Services user (e.g. IP address), may be disclosed (i) to authorized officers of the court in response to legal process (for example, a court order, search warrant or subpoena) or in other circumstances in which ICQ believes the ICQ Services is being used in the commission of a crime or when we have a good faith belief that there is an emergency that poses a threat to the safety of you or another person; or (ii) when necessary either to protect the rights or property of ICQ, the ICQ Services or its affiliated providers, or for us to render the service you have requested.

І мова йде зовсім не про власницьке (proprietary) програмне забезпечення, бізнес-модель якого просто зобов’язана шляхом ліцензування, обмежити права власних користувачів, і за рахунок цього популяризувати, а тоді й продавати копії продукту, заробляючи таким чином гроші. Ні, мови йде про вільне (не просто відкрите), і про безкоштовне, але закрите (freeware) програмне забезпечення.

Read the rest of this entry »

GTK+ — 5. Діалоги

четвер, Квітень 2nd, 2009

У цій частині я коротко розповім про діалоги у GTK+. Діалог (dialog) — це незамінний елемент сучасних графічних користувацьких інтерфейсів. Діалоги використовуються для “спілкування” програми з користувачами. Наприклад, для отримання від користувача певних даних, зміни існуючих, тощо. Або ж про надання користувачу певної інформації від програми: інформаційні та повідомлення про помилки, тощо.

Інформаційні діалоги

Інформаційні діалоги використовуються для надання користувачам певної інформації. Вони містять, як текстову, так і графічну інформацію.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <gtk /gtk.h>
 
void show_info(GtkWidget *widget, gpointer window)
{
    GtkWidget *dialog;
 
    dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Download Completed", "title");
    gtk_window_set_title(GTK_WINDOW(dialog), "Information");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}
 
void show_error(GtkWidget *widget, gpointer window)
{
    GtkWidget *dialog;
 
    dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Error loading file");
    gtk_window_set_title(GTK_WINDOW(dialog), "Error");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}
 
void show_question(GtkWidget *widget, gpointer window)
{
    GtkWidget *dialog;
 
    dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Are you sure to quit?");
    gtk_window_set_title(GTK_WINDOW(dialog), "Question");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}
 
void show_warning(GtkWidget *widget, gpointer window)
{
    GtkWidget *dialog;
 
    dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Unallowed operation");
    gtk_window_set_title(GTK_WINDOW(dialog), "Warning");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}
 
int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *table;
 
    GtkWidget *info;
    GtkWidget *warn;
    GtkWidget *que;
    GtkWidget *err;
 
    gtk_init(&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 220, 150);
    gtk_window_set_title(GTK_WINDOW(window), "Message dialogs");
 
    table = gtk_table_new(2, 2, TRUE);
    gtk_table_set_row_spacings(GTK_TABLE(table), 2);
    gtk_table_set_col_spacings(GTK_TABLE(table), 2);
 
    info = gtk_button_new_with_label("Info");
    warn = gtk_button_new_with_label("Warning");
    que = gtk_button_new_with_label("Question");
    err = gtk_button_new_with_label("Error");
 
    gtk_table_attach(GTK_TABLE(table), info, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 3, 3);
    gtk_table_attach(GTK_TABLE(table), warn, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 3, 3);
    gtk_table_attach(GTK_TABLE(table), que, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 3, 3);
    gtk_table_attach(GTK_TABLE(table), err, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 3, 3);
 
    gtk_container_add(GTK_CONTAINER(window), table);
    gtk_container_set_border_width(GTK_CONTAINER(window), 15);
 
    g_signal_connect(G_OBJECT(info), "clicked", G_CALLBACK(show_info), (gpointer) window);
    g_signal_connect(G_OBJECT(warn), "clicked", G_CALLBACK(show_warning), (gpointer) window);
    g_signal_connect(G_OBJECT(que), "clicked", G_CALLBACK(show_question), (gpointer) window);
    g_signal_connect(G_OBJECT(err), "clicked", G_CALLBACK(show_error), (gpointer) window);
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
 
    gtk_widget_show_all(window);
 
    gtk_main();
 
    return 0;
}
</gtk>

У цьому прикладі ми показуємо чотири інформаційних діалоги різних типів: Information, Warning, Question та Error.

1
2
3
4
5
6
GtkWidget *dialog;
dialog = gtk_message_dialog_new(window,
           GTK_DIALOG_DESTROY_WITH_PARENT,
           GTK_MESSAGE_QUESTION,
           GTK_BUTTONS_YES_NO,
           "Are you sure to quit?");

У функції the show_question(), ми відображаємо інформаційний діалог. Сам діалог створюється за допомогою функції gtk_message_dialog_new(). Параметри цієї функції вказують на те, який саме діалог ми бажаємо створити. Константа GTK_MESSAGE_QUESTION створює діалог типу Question (питання). GTK_BUTTONS_YES_NO створить діалог з двома кнопками — “Так” і “Ні”. Останнім параметром завжди є текст, який відображатиметься на діалозі.

1
2
3
gtk_window_set_title(GTK_WINDOW(dialog), "Warning");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

Тут ми задаємо заголовок для діалогу. І запускаємо його. Дестроїти діалог слід власноруч.


Read the rest of this entry »

Матриця компетентності програміста

неділя, Березень 29th, 2009

Тиць.

Буду дуже вдячним за допомогу у виправленні помилок перекладу, якщо такі є!

GTK+ — 4. Події та сигнали

середа, Березень 25th, 2009

У цій частині я розповім про систему подій (events) та сигналів у бібліотеці GTK+. Власне, бібліотека GTK+ є “event driven system”, тобто, такою, що цілком побудована на основі системи подій та сигналів на них. Адже усі графічні додатки є “event driven”, тобто такими, мета яких реагувати на певні дії користувача (події), надсилати своєму коду сигнали, і обробляти їх.

Усе починається з того, що програма запускає головний цикл, який неперервно перевіряє наявність нових подій. Якщо ніяких подій не відбувається, програма тихенько собі спить, і нічогісінько не робить. У GTK+ повідомленнями про події є повідомлення від сервера X. Коли віджет генерує якусь подію, програма може на неї відреагувати. Програміст GTK+ може з’єднувати специфічні колбеки (callback) та сигнали. Сам callback є нічим іншим, як вказівником на звичайнісіньку функцію, яка реагуватиме на сигнал. Наприклад, маємо віджет “кнопка”, подію “натискання на кнопку”, і колбек (функцію), яка викликається при обробці події (натискання на кнопку).

У версії 2.0 сигнальну систему було перенесена з GTK до GLib, ось чому функції і типи, що описуються в цьому розділі мають префікс “g_” а не “gtk_”. Ми не будемо заглиблюватись в деталі, що до додаткових можливостей, які дає сигнальна система GLib 2.0 порівняно з сигнальною системою GTK 1.2.

Read the rest of this entry »

GTK+ — 3. Керування позиціонуванням віджетів

неділя, Лютий 8th, 2009

У цій “лекції” я спробую пояснити, яким чином додавати на вікно нові віджети, та організувати їхнє бажане для вас позиціонування на ньому.

Власне, річ ось у чім — у GTK+, як і в усіх інших бібліотеках графічних віджетів для UNIX ви не можете (взагалі то можете, але про це, можливо, згодом) тупо накидати будь які віджети (кнопки, мітки, чекбокси, едітбокси, тощо) на форму, встановити зручні для вас розміри і місцерозташування цих віджетів, як, скажімо, у VLC.

UNIX’ові бібліотеки графічних віджетів використовують інших підхід до розміщення елементів на формі. Елементи розміщуються не лише по відношенню до верхнього лівого кута. Їхній розмір ще й задається по відношенню до висоти і ширини форми.

Тобто, якщо ви розмістите на формі лиш одну кнопку, то вона, за замовчуванням, матиме висоту і ширину рівну, відповідно, висоті і ширині форми. Не лякайтесь, ви звісно ж, можете чітко задати позицію та розміри кнопки, однак, даний підхід має низку переваг. Сподіваюсь, пояснити вам їх по ходу…

GtkFixed

Даний контейнер поміщає віджети у чітко фіксовані позиції і задає для них чітко фіксовані розміри. Даний контейнер не виконує автоматичну схему управління позицією та розміром віджетів. За звичай, він використовується досить рідко, наприклад, у програмах, де можна змінювати розміри віджетів або ж міняти їхню позицію.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <gtk /gtk.h>
 
 
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *fixed;
 
    GtkWidget *button1;
    GtkWidget *button2;
    GtkWidget *button3;
 
    gtk_init(&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "GtkFixed");
    gtk_window_set_default_size(GTK_WINDOW(window), 290, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 
    fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), fixed);
 
    button1 = gtk_button_new_with_label("Button");
    gtk_fixed_put(GTK_FIXED(fixed), button1, 150, 50);
    gtk_widget_set_size_request(button1, 80, 35);
 
    button2 = gtk_button_new_with_label("Button");
    gtk_fixed_put(GTK_FIXED(fixed), button2, 15, 15);
    gtk_widget_set_size_request(button2, 80, 35);
 
    button3 = gtk_button_new_with_label("Button");
    gtk_fixed_put(GTK_FIXED(fixed), button3, 100, 100);
    gtk_widget_set_size_request(button3, 80, 35);
 
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
    gtk_widget_show_all(window);
 
    gtk_main();
 
    return 0;
}
</gtk>

У даному прикладі, ми створюємо три кнопки, і поміщаємо їх на чітко вказані координати. Коли ми змінюємо розміри вікна, кнопки залишаються на своїх місцях.

Тут ми створюємо віджет контейнер GtkFixed:

fixed = gtk_fixed_new();

А тут, за допомогою функції gtk_fixed_put() поміщаємо першу кнопку у позиц

gtk_fixed_put(GTK_FIXED(fixed), button1, 150, 50);

gtkfixed

Read the rest of this entry »