grnWatch.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. #include <gtk/gtk.h>
  2. #include <locale.h>
  3. #include <time.h>
  4. #include <math.h>
  5. static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) {
  6. if (event->keyval == GDK_KEY_q || event->keyval == GDK_KEY_Q) {
  7. gtk_main_quit();
  8. return TRUE;
  9. }
  10. return FALSE;
  11. }
  12. // Функция для рисования фигур и часов
  13. static gboolean draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data) {
  14. // Рисование часов (аналогично Tkinter-коду)
  15. double center_x = 341; // Центр часов
  16. double center_y = 384; // Половина высоты окна (768/2)
  17. double radius = 194; // Радиус для секундной стрелки
  18. // Окружности циферблата (как в Tkinter)
  19. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  20. cairo_set_line_width(cr, 1.0);
  21. cairo_arc(cr, center_x, center_y, 253, 0, 2 * G_PI); // Аналог первой окружности
  22. cairo_stroke(cr);
  23. cairo_set_line_width(cr, 3.0);
  24. cairo_arc(cr, center_x, center_y, 195, 0, 2 * G_PI); // Аналог второй окружности
  25. cairo_stroke(cr);
  26. cairo_set_line_width(cr, 1.0);
  27. cairo_arc(cr, center_x, center_y, 174, 0, 2 * G_PI); // Аналог третьей окружности
  28. cairo_stroke(cr);
  29. cairo_arc(cr, center_x, center_y, 166, 0, 2 * G_PI); // Аналог четвёртой окружности
  30. cairo_stroke(cr);
  31. // 60 маленьких кружков
  32. for (int i = 0; i < 60; i++) {
  33. double angle = -i * 6 * G_PI / 180 + G_PI / 2;
  34. double x = center_x + 170 * cos(angle);
  35. double y = center_y - 170 * sin(angle);
  36. cairo_arc(cr, x, y, 4, 0, 2 * G_PI);
  37. cairo_fill(cr);
  38. }
  39. // 12 больших кружков
  40. for (int i = 0; i < 12; i++) {
  41. double angle = -i * 30 * G_PI / 180 + G_PI / 2;
  42. double x = center_x + 185 * cos(angle);
  43. double y = center_y - 185 * sin(angle);
  44. cairo_set_line_width(cr, 3.0);
  45. cairo_arc(cr, x, y, 9, 0, 2 * G_PI);
  46. cairo_stroke(cr);
  47. }
  48. // 12 внешних кружков
  49. for (int i = 0; i < 12; i++) {
  50. double angle = -i * 30 * G_PI / 180 + G_PI / 2;
  51. double x = center_x + 225 * cos(angle);
  52. double y = center_y - 225 * sin(angle);
  53. cairo_set_line_width(cr, 1.0);
  54. cairo_arc(cr, x, y, 28, 0, 2 * G_PI);
  55. cairo_stroke(cr);
  56. }
  57. // Рисование линии для 1-го часа
  58. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  59. cairo_set_line_width(cr, 1.0);
  60. cairo_move_to(cr, 454, 160); // Начальная точка линии
  61. cairo_line_to(cr, 454, 191); // Конечная точка линии
  62. cairo_stroke(cr);
  63. // Рисование линии для 2-го часа
  64. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  65. cairo_set_line_width(cr, 1.0);
  66. cairo_move_to(cr, 535, 244); // Начальная точка линии
  67. cairo_line_to(cr, 535, 301); // Конечная точка линии
  68. cairo_stroke(cr);
  69. // Рисование треугольника для 3-го часа
  70. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  71. cairo_set_line_width(cr, 1.0);
  72. double center_x_3 = 567; // Центр треугольника
  73. double center_y_3 = 384;
  74. double radius_3 = 28;
  75. for (int i = 0; i < 3; i++) {
  76. double angle = -i * 120 * G_PI / 180 + G_PI / 2;
  77. double x1 = center_x_3 + radius_3 * cos(angle);
  78. double y1 = center_y_3 - radius_3 * sin(angle);
  79. int next_i = (i + 1) % 3;
  80. double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2;
  81. double x2 = center_x_3 + radius_3 * cos(next_angle);
  82. double y2 = center_y_3 - radius_3 * sin(next_angle);
  83. cairo_move_to(cr, x1, y1);
  84. cairo_line_to(cr, x2, y2);
  85. cairo_stroke(cr);
  86. }
  87. // Рисование квадрата для 4-го часа
  88. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  89. cairo_set_line_width(cr, 1.0);
  90. double center_x_4 = 537; // Центр квадрата
  91. double center_y_4 = 496;
  92. double radius_4 = 28;
  93. for (int i = 0; i < 4; i++) {
  94. double angle = -i * 90 * G_PI / 180 + G_PI / 4; // Смещение на 45 градусов
  95. double x1 = center_x_4 + radius_4 * cos(angle);
  96. double y1 = center_y_4 - radius_4 * sin(angle);
  97. int next_i = (i + 1) % 4;
  98. double next_angle = -next_i * 90 * G_PI / 180 + G_PI / 4;
  99. double x2 = center_x_4 + radius_4 * cos(next_angle);
  100. double y2 = center_y_4 - radius_4 * sin(next_angle);
  101. cairo_move_to(cr, x1, y1);
  102. cairo_line_to(cr, x2, y2);
  103. cairo_stroke(cr);
  104. }
  105. // Рисование пятиконечной звезды для 5-го часа
  106. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  107. cairo_set_line_width(cr, 1.0);
  108. double center_x_5 = 454; // Центр звезды
  109. double center_y_5 = 579;
  110. double radius_5 = 28;
  111. for (int i = 0; i < 5; i++) {
  112. double angle = -i * 144 * G_PI / 180 + G_PI / 2; // Угол поворота на 144 градуса
  113. double x1 = center_x_5 + radius_5 * cos(angle);
  114. double y1 = center_y_5 - radius_5 * sin(angle);
  115. int next_i = (i + 1) % 5;
  116. double next_angle = -next_i * 144 * G_PI / 180 + G_PI / 2;
  117. double x2 = center_x_5 + radius_5 * cos(next_angle);
  118. double y2 = center_y_5 - radius_5 * sin(next_angle);
  119. cairo_move_to(cr, x1, y1);
  120. cairo_line_to(cr, x2, y2);
  121. cairo_stroke(cr);
  122. }
  123. // Рисование треугольника для 6-го часа (первый треугольник)
  124. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  125. cairo_set_line_width(cr, 1.0);
  126. double center_x_6 = 341; // Центр треугольника
  127. double center_y_6 = 610;
  128. double radius_6 = 28;
  129. for (int i = 0; i < 3; i++) {
  130. double angle = -i * 120 * G_PI / 180 + G_PI / 2;
  131. double x1 = center_x_6 + radius_6 * cos(angle);
  132. double y1 = center_y_6 - radius_6 * sin(angle);
  133. int next_i = (i + 1) % 3;
  134. double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2;
  135. double x2 = center_x_6 + radius_6 * cos(next_angle);
  136. double y2 = center_y_6 - radius_6 * sin(next_angle);
  137. cairo_move_to(cr, x1, y1);
  138. cairo_line_to(cr, x2, y2);
  139. cairo_stroke(cr);
  140. }
  141. // Рисование второго треугольника для 6-го часа
  142. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  143. cairo_set_line_width(cr, 1.0);
  144. for (int i = 0; i < 3; i++) {
  145. double angle = -i * 120 * G_PI / 180 + G_PI / 6;
  146. double x1 = center_x_6 + radius_6 * cos(angle);
  147. double y1 = center_y_6 - radius_6 * sin(angle);
  148. int next_i = (i + 1) % 3;
  149. double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 6;
  150. double x2 = center_x_6 + radius_6 * cos(next_angle);
  151. double y2 = center_y_6 - radius_6 * sin(next_angle);
  152. cairo_move_to(cr, x1, y1);
  153. cairo_line_to(cr, x2, y2);
  154. cairo_stroke(cr);
  155. }
  156. // Дополнительные линии для 6-го часа
  157. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  158. cairo_set_line_width(cr, 1.0);
  159. cairo_move_to(cr, 326, 609);
  160. cairo_line_to(cr, 358, 609);
  161. cairo_stroke(cr);
  162. cairo_move_to(cr, 332, 595);
  163. cairo_line_to(cr, 349, 624);
  164. cairo_stroke(cr);
  165. cairo_move_to(cr, 349, 595);
  166. cairo_line_to(cr, 332, 624);
  167. cairo_stroke(cr);
  168. // Рисование семиконечной звезды для 7-го часа
  169. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  170. cairo_set_line_width(cr, 1.0);
  171. double center_x_7 = 218; // Центр звезды
  172. double center_y_7 = 579;
  173. double radius_7 = 28;
  174. for (int i = 0; i < 7; i++) {
  175. double angle = -i * (360 / 7) * G_PI / 180 + G_PI / 2;
  176. double x1 = center_x_7 + radius_7 * cos(angle) + 10;
  177. double y1 = center_y_7 - radius_7 * sin(angle) - 1;
  178. int next_i = (i + 3) % 7; // Смещение на 3 шага для семиконечной звезды
  179. double next_angle = -next_i * (360 / 7) * G_PI / 180 + G_PI / 2;
  180. double x2 = center_x_7 + radius_7 * cos(next_angle) + 10;
  181. double y2 = center_y_7 - radius_7 * sin(next_angle) - 1;
  182. cairo_move_to(cr, x1, y1);
  183. cairo_line_to(cr, x2, y2);
  184. cairo_stroke(cr);
  185. }
  186. /// --- *** 8 *** --------------------------------------
  187. // Рисование двух квадратов для 8-го часа
  188. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  189. cairo_set_line_width(cr, 1.0);
  190. double center_x_8 = 147; // Центр для 8-го часа
  191. double center_y_8 = 496;
  192. double radius_8 = 28;
  193. // Первый квадрат (0°, 90°, 180°, 270°)
  194. for (int i = 0; i < 4; i++) {
  195. double angle = -i * 90 * G_PI / 180 + G_PI / 2;
  196. double x1 = center_x_8 + radius_8 * cos(angle);
  197. double y1 = center_y_8 - radius_8 * sin(angle);
  198. int next_i = (i + 1) % 4;
  199. double next_angle = -next_i * 90 * G_PI / 180 + G_PI / 2;
  200. double x2 = center_x_8 + radius_8 * cos(next_angle);
  201. double y2 = center_y_8 - radius_8 * sin(next_angle);
  202. cairo_move_to(cr, x1, y1);
  203. cairo_line_to(cr, x2, y2);
  204. cairo_stroke(cr);
  205. }
  206. // Второй квадрат (45°, 135°, 225°, 315°)
  207. for (int i = 0; i < 4; i++) {
  208. double angle = -i * 90 * G_PI / 180 + G_PI / 4;
  209. double x1 = center_x_8 + radius_8 * cos(angle);
  210. double y1 = center_y_8 - radius_8 * sin(angle);
  211. int next_i = (i + 1) % 4;
  212. double next_angle = -next_i * 90 * G_PI / 180 + G_PI / 4;
  213. double x2 = center_x_8 + radius_8 * cos(next_angle);
  214. double y2 = center_y_8 - radius_8 * sin(next_angle);
  215. cairo_move_to(cr, x1, y1);
  216. cairo_line_to(cr, x2, y2);
  217. cairo_stroke(cr);
  218. }
  219. /// --- *** 9 *** ---------------------------------------------
  220. // Рисование трёх треугольников для 9-го часа
  221. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  222. cairo_set_line_width(cr, 1.0);
  223. double center_x_9 = 118; // Центр для 9-го часа
  224. double center_y_9 = 384;
  225. double radius_9 = 28;
  226. // Первый треугольник (0° поворот)
  227. for (int i = 0; i < 3; i++) {
  228. double angle = -i * 120 * G_PI / 180 + G_PI / 2;
  229. double x1 = center_x_9 + radius_9 * cos(angle);
  230. double y1 = center_y_9 - radius_9 * sin(angle);
  231. int next_i = (i + 1) % 3;
  232. double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2;
  233. double x2 = center_x_9 + radius_9 * cos(next_angle);
  234. double y2 = center_y_9 - radius_9 * sin(next_angle);
  235. cairo_move_to(cr, x1, y1);
  236. cairo_line_to(cr, x2, y2);
  237. cairo_stroke(cr);
  238. }
  239. // Второй треугольник (поворот на 40° вправо)
  240. for (int i = 0; i < 3; i++) {
  241. double angle = -i * 120 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 9;
  242. double x1 = center_x_9 + radius_9 * cos(angle);
  243. double y1 = center_y_9 - radius_9 * sin(angle);
  244. int next_i = (i + 1) % 3;
  245. double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 9;
  246. double x2 = center_x_9 + radius_9 * cos(next_angle);
  247. double y2 = center_y_9 - radius_9 * sin(next_angle);
  248. cairo_move_to(cr, x1, y1);
  249. cairo_line_to(cr, x2, y2);
  250. cairo_stroke(cr);
  251. }
  252. // Третий треугольник (поворот на 40° влево)
  253. for (int i = 0; i < 3; i++) {
  254. double angle = -i * 120 * G_PI / 180 + G_PI / 2 - 2 * G_PI / 9;
  255. double x1 = center_x_9 + radius_9 * cos(angle);
  256. double y1 = center_y_9 - radius_9 * sin(angle);
  257. int next_i = (i + 1) % 3;
  258. double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2 - 2 * G_PI / 9;
  259. double x2 = center_x_9 + radius_9 * cos(next_angle);
  260. double y2 = center_y_9 - radius_9 * sin(next_angle);
  261. cairo_move_to(cr, x1, y1);
  262. cairo_line_to(cr, x2, y2);
  263. cairo_stroke(cr);
  264. }
  265. /// --- *** 10 *** -----------------------------------------------------------
  266. // Рисование двух пятиконечных звёзд для 10-го часа
  267. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  268. cairo_set_line_width(cr, 1.0);
  269. double center_x_10 = 147; // Центр для 10-го часа
  270. double center_y_10 = 272; // Скорректировано для позиции 10-го часа
  271. double radius_10 = 28;
  272. // Первая звезда (нормальная ориентация)
  273. for (int i = 0; i < 5; i++) {
  274. double angle = -i * 144 * G_PI / 180 + G_PI / 2;
  275. double x1 = center_x_10 + radius_10 * cos(angle);
  276. double y1 = center_y_10 - radius_10 * sin(angle);
  277. int next_i = (i + 1) % 5;
  278. double next_angle = -next_i * 144 * G_PI / 180 + G_PI / 2;
  279. double x2 = center_x_10 + radius_10 * cos(next_angle);
  280. double y2 = center_y_10 - radius_10 * sin(next_angle);
  281. cairo_move_to(cr, x1, y1);
  282. cairo_line_to(cr, x2, y2);
  283. cairo_stroke(cr);
  284. }
  285. // Вторая звезда (перевёрнутая)
  286. for (int i = 0; i < 5; i++) {
  287. double angle = -i * 144 * G_PI / 180 + G_PI / 2;
  288. double x1 = center_x_10 + radius_10 * cos(angle);
  289. double y1 = center_y_10 + radius_10 * sin(angle); // Знак изменён для перевёрнутой звезды
  290. int next_i = (i + 1) % 5;
  291. double next_angle = -next_i * 144 * G_PI / 180 + G_PI / 2;
  292. double x2 = center_x_10 + radius_10 * cos(next_angle);
  293. double y2 = center_y_10 + radius_10 * sin(next_angle); // Знак изменён
  294. cairo_move_to(cr, x1, y1);
  295. cairo_line_to(cr, x2, y2);
  296. cairo_stroke(cr);
  297. }
  298. /// --- *** 11 *** --------------------------------------------------------------------------
  299. // Рисование одиннадцатиконечной звезды для 11-го часа
  300. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  301. cairo_set_line_width(cr, 1.0);
  302. double center_x_11 = 230; // Центр для 11-го часа
  303. double center_y_11 = 189; // Скорректировано для позиции 11-го часа
  304. double radius_11 = 28;
  305. for (int i = 0; i < 11; i++) {
  306. double angle_increment = 360.0 / 11;
  307. double angle = -i * angle_increment * G_PI / 180 + G_PI / 2;
  308. double x1 = center_x_11 + radius_11 * cos(angle);
  309. double y1 = center_y_11 - radius_11 * sin(angle);
  310. int next_i = (i + 4) % 11; // Смещение на 4 шага для 11-конечной звезды
  311. double next_angle = -next_i * angle_increment * G_PI / 180 + G_PI / 2;
  312. double x2 = center_x_11 + radius_11 * cos(next_angle);
  313. double y2 = center_y_11 - radius_11 * sin(next_angle);
  314. cairo_move_to(cr, x1, y1);
  315. cairo_line_to(cr, x2, y2);
  316. cairo_stroke(cr);
  317. }
  318. /// --- *** 12 *** ---------------------------------------------------------------------------
  319. // Рисование 12-го часа
  320. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  321. cairo_set_line_width(cr, 1.0);
  322. // Снежинка
  323. cairo_move_to(cr, 326, 159); // 327, 98
  324. cairo_line_to(cr, 359, 159); // 360, 98
  325. cairo_stroke(cr);
  326. cairo_move_to(cr, 333, 145); // 334, 84
  327. cairo_line_to(cr, 350, 174); // 351, 113
  328. cairo_stroke(cr);
  329. cairo_move_to(cr, 350, 145); // 351, 84
  330. cairo_line_to(cr, 333, 173); // 334, 112
  331. cairo_stroke(cr);
  332. // 12-угольник
  333. double center_x_12 = 341; // Центр для 12-го часа (смещён относительно Python)
  334. double center_y_12 = 159; // Скорректировано: 98 + (384 - 323)
  335. double radius_12 = 28;
  336. for (int i = 0; i < 12; i++) {
  337. double angle = -i * 30 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 24; // Поворот на 15° (1/24 окружности)
  338. double x1 = center_x_12 + radius_12 * cos(angle);
  339. double y1 = center_y_12 - radius_12 * sin(angle);
  340. int next_i = (i + 1) % 12;
  341. double next_angle = -next_i * 30 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 24;
  342. double x2 = center_x_12 + radius_12 * cos(next_angle);
  343. double y2 = center_y_12 - radius_12 * sin(next_angle);
  344. cairo_move_to(cr, x1, y1);
  345. cairo_line_to(cr, x2, y2);
  346. cairo_stroke(cr);
  347. }
  348. // Первая группа линий
  349. cairo_move_to(cr, 334, 132); // 335, 71 + (384 - 323)
  350. cairo_line_to(cr, 334, 147); // 335, 86 + (384 - 323)
  351. cairo_stroke(cr);
  352. cairo_move_to(cr, 349, 132); // 350, 71
  353. cairo_line_to(cr, 349, 147); // 350, 86
  354. cairo_stroke(cr);
  355. cairo_move_to(cr, 363, 139); // 364, 78
  356. cairo_line_to(cr, 349, 147); // 350, 86
  357. cairo_stroke(cr);
  358. cairo_move_to(cr, 367, 152); // 368, 91
  359. cairo_line_to(cr, 355, 159); // 356, 98
  360. cairo_stroke(cr);
  361. cairo_move_to(cr, 320, 139); // 321, 78
  362. cairo_line_to(cr, 334, 147); // 335, 86
  363. cairo_stroke(cr);
  364. cairo_move_to(cr, 316, 152); // 317, 91
  365. cairo_line_to(cr, 327, 159); // 328, 98
  366. cairo_stroke(cr);
  367. cairo_move_to(cr, 349, 170); // 350, 109
  368. cairo_line_to(cr, 349, 187); // 350, 126
  369. cairo_stroke(cr);
  370. cairo_move_to(cr, 334, 170); // 335, 109
  371. cairo_line_to(cr, 334, 187); // 335, 126
  372. cairo_stroke(cr);
  373. cairo_move_to(cr, 327, 160); // 328, 99
  374. cairo_line_to(cr, 313, 167); // 314, 106
  375. cairo_stroke(cr);
  376. cairo_move_to(cr, 333, 172); // 334, 111
  377. cairo_line_to(cr, 318, 179); // 319, 118
  378. cairo_stroke(cr);
  379. cairo_move_to(cr, 353, 159); // 354, 98
  380. cairo_line_to(cr, 370, 167); // 371, 106
  381. cairo_stroke(cr);
  382. cairo_move_to(cr, 350, 171); // 351, 110
  383. cairo_line_to(cr, 364, 180); // 365, 119
  384. cairo_stroke(cr);
  385. // Шестиконечная звезда
  386. double radius_star = 16;
  387. for (int i = 0; i < 6; i++) {
  388. double angle = -i * 60 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 12; // Поворот на 30° (1/12 окружности)
  389. double x1 = center_x_12 + radius_star * cos(angle);
  390. double y1 = center_y_12 - radius_star * sin(angle);
  391. int next_i = (i + 1) % 6;
  392. double next_angle = -next_i * 60 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 12;
  393. double x2 = center_x_12 + radius_star * cos(next_angle);
  394. double y2 = center_y_12 - radius_star * sin(next_angle);
  395. cairo_move_to(cr, x1, y1);
  396. cairo_line_to(cr, x2, y2);
  397. cairo_stroke(cr);
  398. }
  399. /// --- *** 12 конец *** ---------------------------------------------------------------------------
  400. ///------------------------------------------------------------------------------------------
  401. // Получение текущего времени
  402. time_t rawtime;
  403. struct tm *timeinfo;
  404. time(&rawtime);
  405. timeinfo = localtime(&rawtime);
  406. int time_sec = timeinfo->tm_sec;
  407. int time_min = timeinfo->tm_min;
  408. int time_hour = timeinfo->tm_hour % 12; // 12-часовой формат
  409. // Углы стрелок
  410. double sec_angle = 6 * time_sec;
  411. double min_angle = 6 * (time_min + (1.0 / 60) * time_sec);
  412. double hour_angle = 30 * (time_hour + (1.0 / 60) * time_min);
  413. // Секундная стрелка
  414. cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
  415. cairo_set_line_width(cr, 2.0);
  416. double x_end_sec = center_x - radius * cos(sec_angle * G_PI / 180 + G_PI / 2);
  417. double y_end_sec = center_y - radius * sin(sec_angle * G_PI / 180 + G_PI / 2);
  418. cairo_move_to(cr, center_x, center_y);
  419. cairo_line_to(cr, x_end_sec, y_end_sec);
  420. cairo_stroke(cr);
  421. // Минутная стрелка
  422. cairo_set_line_width(cr, 3.0);
  423. double minute_hand_length = 173;
  424. double x_end_min = center_x - minute_hand_length * cos(min_angle * G_PI / 180 + G_PI / 2);
  425. double y_end_min = center_y - minute_hand_length * sin(min_angle * G_PI / 180 + G_PI / 2);
  426. cairo_move_to(cr, center_x, center_y);
  427. cairo_line_to(cr, x_end_min, y_end_min);
  428. cairo_stroke(cr);
  429. // Часовая стрелка
  430. cairo_set_line_width(cr, 5.0);
  431. double hour_hand_length = 167;
  432. double x_end_hour = center_x - hour_hand_length * cos(hour_angle * G_PI / 180 + G_PI / 2);
  433. double y_end_hour = center_y - hour_hand_length * sin(hour_angle * G_PI / 180 + G_PI / 2);
  434. cairo_move_to(cr, center_x, center_y);
  435. cairo_line_to(cr, x_end_hour, y_end_hour);
  436. cairo_stroke(cr);
  437. return FALSE;
  438. }
  439. // Функция обновления часов
  440. static gboolean update_clock(gpointer data) {
  441. GtkWidget *drawing_area = GTK_WIDGET(data);
  442. gtk_widget_queue_draw(drawing_area); // Перерисовка области
  443. return TRUE; // Продолжать вызов
  444. }
  445. int main(int argc, char *argv[]) {
  446. setlocale(LC_ALL, "ru_RU.UTF-8");
  447. if (!setlocale(LC_ALL, "")) {
  448. printf("Ошибка установки локали\n");
  449. return 1;
  450. }
  451. gtk_init(&argc, &argv);
  452. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  453. gtk_window_set_title(GTK_WINDOW(window), "acpi - Desktop Version");
  454. gtk_window_set_default_size(GTK_WINDOW(window), 670, 716); // Размер как в Tkinter
  455. gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  456. gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  457. gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
  458. // Контейнер и фон
  459. GtkWidget *overlay = gtk_overlay_new();
  460. gtk_container_add(GTK_CONTAINER(window), overlay);
  461. GtkWidget *background = gtk_image_new_from_file("grnWatch.jpg");
  462. gtk_overlay_add_overlay(GTK_OVERLAY(overlay), background);
  463. gtk_widget_set_halign(background, GTK_ALIGN_FILL);
  464. gtk_widget_set_valign(background, GTK_ALIGN_FILL);
  465. // Область рисования
  466. GtkWidget *drawing_area = gtk_drawing_area_new();
  467. gtk_widget_set_size_request(drawing_area, 683, 768); // Полный размер окна
  468. gtk_overlay_add_overlay(GTK_OVERLAY(overlay), drawing_area);
  469. gtk_widget_set_halign(drawing_area, GTK_ALIGN_CENTER);
  470. gtk_widget_set_valign(drawing_area, GTK_ALIGN_CENTER);
  471. // Подключаем функцию рисования и обновления
  472. g_signal_connect(drawing_area, "draw", G_CALLBACK(draw_callback), NULL);
  473. g_timeout_add(1000, update_clock, drawing_area); // Обновление каждую секунду
  474. // CSS для прозрачности фона виджета
  475. GtkCssProvider *provider = gtk_css_provider_new();
  476. gtk_css_provider_load_from_data(provider,
  477. "drawing-area {"
  478. " background-color: transparent;"
  479. "}",
  480. -1, NULL);
  481. gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
  482. GTK_STYLE_PROVIDER(provider),
  483. GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
  484. g_object_unref(provider);
  485. // Сигналы
  486. g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  487. g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
  488. gtk_widget_show_all(window);
  489. gtk_main();
  490. return 0;
  491. }
  492. // gcc window.c -o window `pkg-config --cflags --libs gtk+-3.0` -lm