255 lines
17 KiB
C
255 lines
17 KiB
C
#include <gtk/gtk.h>
|
||
#include <locale.h>
|
||
|
||
static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) {
|
||
if (event->keyval == GDK_KEY_q || event->keyval == GDK_KEY_Q) {
|
||
gtk_main_quit();
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
int main(int argc, char *argv[]) {
|
||
setlocale(LC_ALL, "ru_RU.UTF-8");
|
||
if (!setlocale(LC_ALL, "")) {
|
||
printf("Ошибка установки локали\n");
|
||
return 1;
|
||
}
|
||
|
||
gtk_init(&argc, &argv);
|
||
|
||
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||
gtk_window_set_title(GTK_WINDOW(window), "acpi - Desktop Version");
|
||
gtk_window_set_default_size(GTK_WINDOW(window), 670, 715);
|
||
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
|
||
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
|
||
gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
|
||
|
||
// Контейнер и фон
|
||
GtkWidget *overlay = gtk_overlay_new();
|
||
gtk_container_add(GTK_CONTAINER(window), overlay);
|
||
|
||
GtkWidget *background = gtk_image_new_from_file("grnWatch.jpg");
|
||
gtk_overlay_add_overlay(GTK_OVERLAY(overlay), background);
|
||
gtk_widget_set_halign(background, GTK_ALIGN_FILL);
|
||
gtk_widget_set_valign(background, GTK_ALIGN_FILL);
|
||
|
||
// Виджет прокрутки и текстовое поле
|
||
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
|
||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||
gtk_widget_set_size_request(scrolled_window, 630, 680); // ширина и высота
|
||
gtk_widget_set_halign(scrolled_window, GTK_ALIGN_CENTER);
|
||
gtk_widget_set_valign(scrolled_window, GTK_ALIGN_CENTER);
|
||
gtk_overlay_add_overlay(GTK_OVERLAY(overlay), scrolled_window);
|
||
|
||
GtkWidget *text_view = gtk_text_view_new();
|
||
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view), GTK_WRAP_WORD_CHAR);
|
||
gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE);
|
||
gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);
|
||
|
||
// Вставка текста
|
||
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
|
||
const gchar *poem =
|
||
"\n"
|
||
" *** Сравнительное техническое описание трёх реализаций аналоговых часов ***\n"
|
||
"\n"
|
||
" Ниже представлено сравнение трёх скриптов, реализующих аналоговые часы\n"
|
||
" с уникальным дизайном циферблата, написанных на разных языках программирования:\n"
|
||
" C (с использованием GTK),\n"
|
||
" Python (с использованием Tkinter)\n"
|
||
" и JavaScript (с использованием HTML5 Canvas).\n"
|
||
" Каждый скрипт создаёт графический интерфейс с часами,\n"
|
||
" отображающими текущее время, и использует фоновое изображение `grnWatch`\n"
|
||
" для стилизации.\n"
|
||
"\n"
|
||
" * Общее описание *\n"
|
||
"\n"
|
||
" Все три скрипта реализуют аналоговые часы с:\n"
|
||
" - Часовой, минутной и секундной стрелками.\n"
|
||
" - Уникальными символами вместо традиционных цифр\n"
|
||
" (линии, звёзды, многоугольники и т.д.) для обозначения часов.\n"
|
||
" - Фоновым изображением (`grnWatch.jpg`, `grnWatch.gif`, `grnWatch.png`\n"
|
||
" соответственно).\n"
|
||
" - Обновлением времени в реальном времени (каждую секунду).\n"
|
||
"\n"
|
||
" Однако подходы к реализации, используемые библиотеки\n"
|
||
" и детали различаются в зависимости от языка и платформы.\n"
|
||
"\n"
|
||
"+---------------------------+---------------------------------+\n"
|
||
"| * Сравнительная таблица: Основные характеристики * |\n"
|
||
"+---------------------------+---------------------------------+\n"
|
||
"| Характеристика | C (GTK) |\n"
|
||
"+---------------------------+---------------------------------+\n"
|
||
"| **Язык программирования** | C |\n"
|
||
"| **Библиотека/Фреймворк** | GTK 3.0, Cairo |\n"
|
||
"| **Платформа** | Десктоп (Linux/Windows) |\n"
|
||
"| **Размер окна/холста** | 670x716 пикселей |\n"
|
||
"| **Формат фона** | JPG (`grnWatch.jpg`) |\n"
|
||
"| **Обновление времени** | Каждую секунду (g_timeout_add) |\n"
|
||
"| **Компиляция/Запуск** | Требует компиляции (gcc) |\n"
|
||
"| **Зависимости** | GTK 3.0, Cairo, libm |\n"
|
||
"+---------------------------+---------------------------------+\n"
|
||
"\n"
|
||
"+------------------------------+-------------------------------+\n"
|
||
"| Python (Tkinter) | JavaScript (HTML5 Canvas) |\n"
|
||
"|------------------------------|-------------------------------|\n"
|
||
"| Python | JavaScript |\n"
|
||
"| Tkinter | HTML5 Canvas |\n"
|
||
"| Десктоп (кроссплатформенная) | Веб-браузер |\n"
|
||
"| 683x768 пикселей | 616x616 пикселей |\n"
|
||
"| GIF (`grnWatch.gif`) | PNG (`grnWatch.png`) |\n"
|
||
"| Каждую секунду (root.after) | Каждую секунду (setInterval) |\n"
|
||
"| Интерпретируемый (python3) | Запуск в браузере |\n"
|
||
"| Tkinter (python3-tk) | Нет (браузер с поддержкой JS) |\n"
|
||
"+------------------------------+-------------------------------+\n"
|
||
"\n"
|
||
"+---------------------------+-----------------------------------+\n"
|
||
"| * Сравнительная таблица: Элементы дизайна циферблата * |\n"
|
||
"+------------------------------+--------------------------------+\n"
|
||
"| Элемент | C (GTK) |\n"
|
||
"+------------------------------+--------------------------------+\n"
|
||
"| **Центр циферблата** | (341, 384) |\n"
|
||
"| **Радиус секундной стрелки** | 194 пикселя |\n"
|
||
"| **Круги циферблата** | 4 круга (253, 195, 174, 166) |\n"
|
||
"| **Маленькие кружки** | 60 (радиус 4, расстояние 170) |\n"
|
||
"| **Большие кружки (часы)** | 12 (радиус 9, расстояние 185) |\n"
|
||
"| **Внешние круги** | 12 (радиус 28, расстояние 225) |\n"
|
||
"| **Цвет линий** | LightCyan (0.68, 0.93, 0.93) |\n"
|
||
"+------------------------------+--------------------------------+\n"
|
||
"\n"
|
||
"+--------------------------------+--------------------------------+\n"
|
||
"| Python (Tkinter) | JavaScript (HTML5 Canvas) |\n"
|
||
"+--------------------------------+--------------------------------+\n"
|
||
"| (342, 323) | (308, 308) |\n"
|
||
"| 194 пикселя | 208 пикселей |\n"
|
||
"| 4 круга (разные радиусы) | 4 круга (198, 208, 233, 303) |\n"
|
||
"| 60 (радиус 4, расстояние 170) | 30 (радиус 5, расстояние 203) |\n"
|
||
"| 12 (радиус 9, расстояние 185) | 12 (радиус 13, расстояние 220) |\n"
|
||
"| 12 (радиус 28, расстояние 225) | 12 (радиус 34, расстояние 268) |\n"
|
||
"| LightCyan | DarkCyan + Teal (заливка) |\n"
|
||
"+--------------------------------+--------------------------------+\n"
|
||
"\n"
|
||
"+----------------------------------------------------------------+\n"
|
||
"| * Сравнительная таблица: Символы часов * |\n"
|
||
"+-----+-----------------------------+----------------------------+\n"
|
||
"| Час | C (GTK) | Python (Tkinter) |\n"
|
||
"+-----+-----------------------------+----------------------------+\n"
|
||
"| 1 | Вертикальная линия | Вертикальная линия |\n"
|
||
"| 2 | Вертикальная линия | Вертикальная линия |\n"
|
||
"| 3 | Треугольник | Треугольник |\n"
|
||
"| 4 | Квадрат | Квадрат |\n"
|
||
"| 5 | Пятиконечная звезда | Пятиконечная звезда |\n"
|
||
"| 6 | Два треугольника + линии | Два треугольника + линии |\n"
|
||
"| 7 | Семиконечная звезда | Семиконечная звезда |\n"
|
||
"| 8 | Два квадрата | Два квадрата |\n"
|
||
"| 9 | Три треугольника | Три треугольника |\n"
|
||
"| 10 | Две пятиконечные звезды | Две пятиконечные звезды |\n"
|
||
"| 11 | Одиннадцатиконечная звезда | Одиннадцатиконечная звезда |\n"
|
||
"| 12 | Двенадцатиугольник + звезда | Двенадцатиугольник + линии |\n"
|
||
"+-----+-----------------------------+----------------------------+\n"
|
||
"\n"
|
||
"+-----+-----------------------------+\n"
|
||
"| Час | JavaScript (HTML5 Canvas) |\n"
|
||
"+-----+-----------------------------+\n"
|
||
"| 1 | Вертикальная линия |\n"
|
||
"| 2 | Вертикальная линия |\n"
|
||
"| 3 | Треугольник |\n"
|
||
"| 4 | Квадрат |\n"
|
||
"| 5 | Пятиконечная звезда |\n"
|
||
"| 6 | Шестиконечная мозаика |\n"
|
||
"| 7 | Семиконечная звезда |\n"
|
||
"| 8 | Восьмиконечная звезда |\n"
|
||
"| 9 | Девятиконечная звезда |\n"
|
||
"| 10 | Десятиконечная звезда |\n"
|
||
"| 11 | Одиннадцатиконечная звезда |\n"
|
||
"| 12 | Двенадцатиугольник + звезда |\n"
|
||
"+-----+-----------------------------+\n"
|
||
"\n"
|
||
" * Подробное описание каждого скрипта *\n"
|
||
"\n"
|
||
" * 1. C (GTK)\n"
|
||
" ** Описание **: Программа на C использует библиотеку GTK 3.0\n"
|
||
" для создания окна и Cairo для рисования графики.\n"
|
||
" Это настольное приложение, требующее компиляции.\n"
|
||
" ** Особенности **:\n"
|
||
" - Использует `cairo_t` для рисования всех элементов (круги, линии, стрелки).\n"
|
||
" - Обновление времени реализовано через `g_timeout_add`,\n"
|
||
" вызывающий перерисовку каждую секунду.\n"
|
||
" - Фон (`grnWatch.jpg`) накладывается через `GtkOverlay`.\n"
|
||
" - Закрытие окна по нажатию клавиши `Q`.\n"
|
||
" ** Преимущества **: Высокая производительность, нативный вид на десктопе.\n"
|
||
" ** Недостатки **: Требует установки зависимостей (GTK, Cairo) и компиляции.\n"
|
||
"\n"
|
||
" * 2. Python (Tkinter)\n"
|
||
" ** Описание **: Скрипт на Python использует Tkinter\n"
|
||
" для создания графического интерфейса и холста для рисования.\n"
|
||
" Это кроссплатформенное приложение, запускаемое интерпретатором Python.\n"
|
||
" ** Особенности **:\n"
|
||
" - Использует `Canvas` для рисования всех элементов.\n"
|
||
" - Обновление времени через `root.after` каждую секунду.\n"
|
||
" - Фон (`grnWatch.gif`) добавлен как изображение на холсте.\n"
|
||
" - Закрытие по сочетанию клавиш `Ctrl+Q`.\n"
|
||
" ** Преимущества **: Простота запуска, кроссплатформенность,\n"
|
||
" не требует компиляции.\n"
|
||
" ** Недостатки **: Меньшая производительность по сравнению с C,\n"
|
||
" зависимость от Tkinter.\n"
|
||
"\n"
|
||
" 3. JavaScript (HTML5 Canvas)\n"
|
||
" ** Описание **: Веб-приложение, использующее HTML5 Canvas\n"
|
||
" для рисования часов в браузере. Работает без установки дополнительного ПО.\n"
|
||
" ** Особенности **:\n"
|
||
" - Два слоя Canvas: один для статичных элементов (`signs`),\n"
|
||
" другой для стрелок (`alarm`).\n"
|
||
" - Обновление времени через `setInterval` каждую секунду.\n"
|
||
" - Фон (`grnWatch.png`) задан через CSS как `background-image`.\n"
|
||
" - Добавлены эффекты теней (`shadowColor`, `shadowBlur`).\n"
|
||
" ** Преимущества **: Доступность через браузер, нет необходимости в установке.\n"
|
||
" ** Недостатки **: Зависимость от браузера, меньшая точность позиционирования\n"
|
||
" из-за масштабирования.\n"
|
||
"\n"
|
||
" * Вывод *\n"
|
||
" ** C (GTK) **: Лучший выбор для производительных десктопных приложений\n"
|
||
" с нативным интерфейсом, но требует больше усилий для настройки.\n"
|
||
" ** Python (Tkinter) **: Идеально для быстрого прототипирования\n"
|
||
" и кроссплатформенных решений с минимальными зависимостями.\n"
|
||
" ** JavaScript (HTML5 Canvas) **: Оптимально для веб-приложений,\n"
|
||
" доступных без установки, с хорошей визуальной гибкостью.\n"
|
||
"\n"
|
||
" Каждый скрипт демонстрирует схожий дизайн часов,\n"
|
||
" но адаптирован под свою платформу и язык программирования.\n"
|
||
" Выбор зависит от целевой среды использования.\n"
|
||
" ";
|
||
gtk_text_buffer_set_text(buffer, poem, -1);
|
||
|
||
// Добавление CSS для полной прозрачности фона
|
||
GtkCssProvider *provider = gtk_css_provider_new();
|
||
gtk_css_provider_load_from_data(provider,
|
||
"scrolled-window {"
|
||
" background-color: transparent;" // Полностью прозрачный фон для прокрутки
|
||
"}"
|
||
"textview, textview text {"
|
||
" background-color: rgba(224, 225, 225, 0.2);" // Полупрозрачный фон под текстом
|
||
" color: black;" // Цвет текста для читаемости
|
||
" padding-left: 21px;"
|
||
" padding-right: 21px;"
|
||
" padding-top: 21px;"
|
||
" padding-bottom: 21px;"
|
||
"}",
|
||
-1, NULL);
|
||
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
|
||
GTK_STYLE_PROVIDER(provider),
|
||
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||
g_object_unref(provider);
|
||
|
||
// Сигналы
|
||
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
|
||
g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
|
||
|
||
gtk_widget_show_all(window);
|
||
gtk_main();
|
||
|
||
return 0;
|
||
}
|
||
|
||
// gcc -o clock clock.c `pkg-config --cflags --libs gtk+-3.0`
|