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