123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #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`
|