Files
grnWatch/grnWatchFeatures.c

255 lines
17 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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`