grnWatchFeatures.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #include <gtk/gtk.h>
  2. #include <locale.h>
  3. static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) {
  4. if (event->keyval == GDK_KEY_q || event->keyval == GDK_KEY_Q) {
  5. gtk_main_quit();
  6. return TRUE;
  7. }
  8. return FALSE;
  9. }
  10. int main(int argc, char *argv[]) {
  11. setlocale(LC_ALL, "ru_RU.UTF-8");
  12. if (!setlocale(LC_ALL, "")) {
  13. printf("Ошибка установки локали\n");
  14. return 1;
  15. }
  16. gtk_init(&argc, &argv);
  17. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  18. gtk_window_set_title(GTK_WINDOW(window), "acpi - Desktop Version");
  19. gtk_window_set_default_size(GTK_WINDOW(window), 670, 715);
  20. gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  21. gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  22. gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
  23. // Контейнер и фон
  24. GtkWidget *overlay = gtk_overlay_new();
  25. gtk_container_add(GTK_CONTAINER(window), overlay);
  26. GtkWidget *background = gtk_image_new_from_file("grnWatch.jpg");
  27. gtk_overlay_add_overlay(GTK_OVERLAY(overlay), background);
  28. gtk_widget_set_halign(background, GTK_ALIGN_FILL);
  29. gtk_widget_set_valign(background, GTK_ALIGN_FILL);
  30. // Виджет прокрутки и текстовое поле
  31. GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
  32. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  33. gtk_widget_set_size_request(scrolled_window, 630, 680); // ширина и высота
  34. gtk_widget_set_halign(scrolled_window, GTK_ALIGN_CENTER);
  35. gtk_widget_set_valign(scrolled_window, GTK_ALIGN_CENTER);
  36. gtk_overlay_add_overlay(GTK_OVERLAY(overlay), scrolled_window);
  37. GtkWidget *text_view = gtk_text_view_new();
  38. gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view), GTK_WRAP_WORD_CHAR);
  39. gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE);
  40. gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);
  41. // Вставка текста
  42. GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
  43. const gchar *poem =
  44. "\n"
  45. " *** Сравнительное техническое описание трёх реализаций аналоговых часов ***\n"
  46. "\n"
  47. " Ниже представлено сравнение трёх скриптов, реализующих аналоговые часы\n"
  48. " с уникальным дизайном циферблата, написанных на разных языках программирования:\n"
  49. " C (с использованием GTK),\n"
  50. " Python (с использованием Tkinter)\n"
  51. " и JavaScript (с использованием HTML5 Canvas).\n"
  52. " Каждый скрипт создаёт графический интерфейс с часами,\n"
  53. " отображающими текущее время, и использует фоновое изображение `grnWatch`\n"
  54. " для стилизации.\n"
  55. "\n"
  56. " * Общее описание *\n"
  57. "\n"
  58. " Все три скрипта реализуют аналоговые часы с:\n"
  59. " - Часовой, минутной и секундной стрелками.\n"
  60. " - Уникальными символами вместо традиционных цифр\n"
  61. " (линии, звёзды, многоугольники и т.д.) для обозначения часов.\n"
  62. " - Фоновым изображением (`grnWatch.jpg`, `grnWatch.gif`, `grnWatch.png`\n"
  63. " соответственно).\n"
  64. " - Обновлением времени в реальном времени (каждую секунду).\n"
  65. "\n"
  66. " Однако подходы к реализации, используемые библиотеки\n"
  67. " и детали различаются в зависимости от языка и платформы.\n"
  68. "\n"
  69. "+---------------------------+---------------------------------+\n"
  70. "| * Сравнительная таблица: Основные характеристики * |\n"
  71. "+---------------------------+---------------------------------+\n"
  72. "| Характеристика | C (GTK) |\n"
  73. "+---------------------------+---------------------------------+\n"
  74. "| **Язык программирования** | C |\n"
  75. "| **Библиотека/Фреймворк** | GTK 3.0, Cairo |\n"
  76. "| **Платформа** | Десктоп (Linux/Windows) |\n"
  77. "| **Размер окна/холста** | 670x716 пикселей |\n"
  78. "| **Формат фона** | JPG (`grnWatch.jpg`) |\n"
  79. "| **Обновление времени** | Каждую секунду (g_timeout_add) |\n"
  80. "| **Компиляция/Запуск** | Требует компиляции (gcc) |\n"
  81. "| **Зависимости** | GTK 3.0, Cairo, libm |\n"
  82. "+---------------------------+---------------------------------+\n"
  83. "\n"
  84. "+------------------------------+-------------------------------+\n"
  85. "| Python (Tkinter) | JavaScript (HTML5 Canvas) |\n"
  86. "|------------------------------|-------------------------------|\n"
  87. "| Python | JavaScript |\n"
  88. "| Tkinter | HTML5 Canvas |\n"
  89. "| Десктоп (кроссплатформенная) | Веб-браузер |\n"
  90. "| 683x768 пикселей | 616x616 пикселей |\n"
  91. "| GIF (`grnWatch.gif`) | PNG (`grnWatch.png`) |\n"
  92. "| Каждую секунду (root.after) | Каждую секунду (setInterval) |\n"
  93. "| Интерпретируемый (python3) | Запуск в браузере |\n"
  94. "| Tkinter (python3-tk) | Нет (браузер с поддержкой JS) |\n"
  95. "+------------------------------+-------------------------------+\n"
  96. "\n"
  97. "+---------------------------+-----------------------------------+\n"
  98. "| * Сравнительная таблица: Элементы дизайна циферблата * |\n"
  99. "+------------------------------+--------------------------------+\n"
  100. "| Элемент | C (GTK) |\n"
  101. "+------------------------------+--------------------------------+\n"
  102. "| **Центр циферблата** | (341, 384) |\n"
  103. "| **Радиус секундной стрелки** | 194 пикселя |\n"
  104. "| **Круги циферблата** | 4 круга (253, 195, 174, 166) |\n"
  105. "| **Маленькие кружки** | 60 (радиус 4, расстояние 170) |\n"
  106. "| **Большие кружки (часы)** | 12 (радиус 9, расстояние 185) |\n"
  107. "| **Внешние круги** | 12 (радиус 28, расстояние 225) |\n"
  108. "| **Цвет линий** | LightCyan (0.68, 0.93, 0.93) |\n"
  109. "+------------------------------+--------------------------------+\n"
  110. "\n"
  111. "+--------------------------------+--------------------------------+\n"
  112. "| Python (Tkinter) | JavaScript (HTML5 Canvas) |\n"
  113. "+--------------------------------+--------------------------------+\n"
  114. "| (342, 323) | (308, 308) |\n"
  115. "| 194 пикселя | 208 пикселей |\n"
  116. "| 4 круга (разные радиусы) | 4 круга (198, 208, 233, 303) |\n"
  117. "| 60 (радиус 4, расстояние 170) | 30 (радиус 5, расстояние 203) |\n"
  118. "| 12 (радиус 9, расстояние 185) | 12 (радиус 13, расстояние 220) |\n"
  119. "| 12 (радиус 28, расстояние 225) | 12 (радиус 34, расстояние 268) |\n"
  120. "| LightCyan | DarkCyan + Teal (заливка) |\n"
  121. "+--------------------------------+--------------------------------+\n"
  122. "\n"
  123. "+----------------------------------------------------------------+\n"
  124. "| * Сравнительная таблица: Символы часов * |\n"
  125. "+-----+-----------------------------+----------------------------+\n"
  126. "| Час | C (GTK) | Python (Tkinter) |\n"
  127. "+-----+-----------------------------+----------------------------+\n"
  128. "| 1 | Вертикальная линия | Вертикальная линия |\n"
  129. "| 2 | Вертикальная линия | Вертикальная линия |\n"
  130. "| 3 | Треугольник | Треугольник |\n"
  131. "| 4 | Квадрат | Квадрат |\n"
  132. "| 5 | Пятиконечная звезда | Пятиконечная звезда |\n"
  133. "| 6 | Два треугольника + линии | Два треугольника + линии |\n"
  134. "| 7 | Семиконечная звезда | Семиконечная звезда |\n"
  135. "| 8 | Два квадрата | Два квадрата |\n"
  136. "| 9 | Три треугольника | Три треугольника |\n"
  137. "| 10 | Две пятиконечные звезды | Две пятиконечные звезды |\n"
  138. "| 11 | Одиннадцатиконечная звезда | Одиннадцатиконечная звезда |\n"
  139. "| 12 | Двенадцатиугольник + звезда | Двенадцатиугольник + линии |\n"
  140. "+-----+-----------------------------+----------------------------+\n"
  141. "\n"
  142. "+-----+-----------------------------+\n"
  143. "| Час | JavaScript (HTML5 Canvas) |\n"
  144. "+-----+-----------------------------+\n"
  145. "| 1 | Вертикальная линия |\n"
  146. "| 2 | Вертикальная линия |\n"
  147. "| 3 | Треугольник |\n"
  148. "| 4 | Квадрат |\n"
  149. "| 5 | Пятиконечная звезда |\n"
  150. "| 6 | Шестиконечная мозаика |\n"
  151. "| 7 | Семиконечная звезда |\n"
  152. "| 8 | Восьмиконечная звезда |\n"
  153. "| 9 | Девятиконечная звезда |\n"
  154. "| 10 | Десятиконечная звезда |\n"
  155. "| 11 | Одиннадцатиконечная звезда |\n"
  156. "| 12 | Двенадцатиугольник + звезда |\n"
  157. "+-----+-----------------------------+\n"
  158. "\n"
  159. " * Подробное описание каждого скрипта *\n"
  160. "\n"
  161. " * 1. C (GTK)\n"
  162. " ** Описание **: Программа на C использует библиотеку GTK 3.0\n"
  163. " для создания окна и Cairo для рисования графики.\n"
  164. " Это настольное приложение, требующее компиляции.\n"
  165. " ** Особенности **:\n"
  166. " - Использует `cairo_t` для рисования всех элементов (круги, линии, стрелки).\n"
  167. " - Обновление времени реализовано через `g_timeout_add`,\n"
  168. " вызывающий перерисовку каждую секунду.\n"
  169. " - Фон (`grnWatch.jpg`) накладывается через `GtkOverlay`.\n"
  170. " - Закрытие окна по нажатию клавиши `Q`.\n"
  171. " ** Преимущества **: Высокая производительность, нативный вид на десктопе.\n"
  172. " ** Недостатки **: Требует установки зависимостей (GTK, Cairo) и компиляции.\n"
  173. "\n"
  174. " * 2. Python (Tkinter)\n"
  175. " ** Описание **: Скрипт на Python использует Tkinter\n"
  176. " для создания графического интерфейса и холста для рисования.\n"
  177. " Это кроссплатформенное приложение, запускаемое интерпретатором Python.\n"
  178. " ** Особенности **:\n"
  179. " - Использует `Canvas` для рисования всех элементов.\n"
  180. " - Обновление времени через `root.after` каждую секунду.\n"
  181. " - Фон (`grnWatch.gif`) добавлен как изображение на холсте.\n"
  182. " - Закрытие по сочетанию клавиш `Ctrl+Q`.\n"
  183. " ** Преимущества **: Простота запуска, кроссплатформенность,\n"
  184. " не требует компиляции.\n"
  185. " ** Недостатки **: Меньшая производительность по сравнению с C,\n"
  186. " зависимость от Tkinter.\n"
  187. "\n"
  188. " 3. JavaScript (HTML5 Canvas)\n"
  189. " ** Описание **: Веб-приложение, использующее HTML5 Canvas\n"
  190. " для рисования часов в браузере. Работает без установки дополнительного ПО.\n"
  191. " ** Особенности **:\n"
  192. " - Два слоя Canvas: один для статичных элементов (`signs`),\n"
  193. " другой для стрелок (`alarm`).\n"
  194. " - Обновление времени через `setInterval` каждую секунду.\n"
  195. " - Фон (`grnWatch.png`) задан через CSS как `background-image`.\n"
  196. " - Добавлены эффекты теней (`shadowColor`, `shadowBlur`).\n"
  197. " ** Преимущества **: Доступность через браузер, нет необходимости в установке.\n"
  198. " ** Недостатки **: Зависимость от браузера, меньшая точность позиционирования\n"
  199. " из-за масштабирования.\n"
  200. "\n"
  201. " * Вывод *\n"
  202. " ** C (GTK) **: Лучший выбор для производительных десктопных приложений\n"
  203. " с нативным интерфейсом, но требует больше усилий для настройки.\n"
  204. " ** Python (Tkinter) **: Идеально для быстрого прототипирования\n"
  205. " и кроссплатформенных решений с минимальными зависимостями.\n"
  206. " ** JavaScript (HTML5 Canvas) **: Оптимально для веб-приложений,\n"
  207. " доступных без установки, с хорошей визуальной гибкостью.\n"
  208. "\n"
  209. " Каждый скрипт демонстрирует схожий дизайн часов,\n"
  210. " но адаптирован под свою платформу и язык программирования.\n"
  211. " Выбор зависит от целевой среды использования.\n"
  212. " ";
  213. gtk_text_buffer_set_text(buffer, poem, -1);
  214. // Добавление CSS для полной прозрачности фона
  215. GtkCssProvider *provider = gtk_css_provider_new();
  216. gtk_css_provider_load_from_data(provider,
  217. "scrolled-window {"
  218. " background-color: transparent;" // Полностью прозрачный фон для прокрутки
  219. "}"
  220. "textview, textview text {"
  221. " background-color: rgba(224, 225, 225, 0.2);" // Полупрозрачный фон под текстом
  222. " color: black;" // Цвет текста для читаемости
  223. " padding-left: 21px;"
  224. " padding-right: 21px;"
  225. " padding-top: 21px;"
  226. " padding-bottom: 21px;"
  227. "}",
  228. -1, NULL);
  229. gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
  230. GTK_STYLE_PROVIDER(provider),
  231. GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
  232. g_object_unref(provider);
  233. // Сигналы
  234. g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  235. g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
  236. gtk_widget_show_all(window);
  237. gtk_main();
  238. return 0;
  239. }
  240. // gcc -o clock clock.c `pkg-config --cflags --libs gtk+-3.0`