541 lines
22 KiB
C
541 lines
22 KiB
C
#include <gtk/gtk.h>
|
||
#include <locale.h>
|
||
#include <time.h>
|
||
#include <math.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;
|
||
}
|
||
|
||
// Функция для рисования фигур и часов
|
||
static gboolean draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data) {
|
||
|
||
// Рисование часов (аналогично Tkinter-коду)
|
||
double center_x = 341; // Центр часов
|
||
double center_y = 384; // Половина высоты окна (768/2)
|
||
double radius = 194; // Радиус для секундной стрелки
|
||
|
||
// Окружности циферблата (как в Tkinter)
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
cairo_arc(cr, center_x, center_y, 253, 0, 2 * G_PI); // Аналог первой окружности
|
||
cairo_stroke(cr);
|
||
cairo_set_line_width(cr, 3.0);
|
||
cairo_arc(cr, center_x, center_y, 195, 0, 2 * G_PI); // Аналог второй окружности
|
||
cairo_stroke(cr);
|
||
cairo_set_line_width(cr, 1.0);
|
||
cairo_arc(cr, center_x, center_y, 174, 0, 2 * G_PI); // Аналог третьей окружности
|
||
cairo_stroke(cr);
|
||
cairo_arc(cr, center_x, center_y, 166, 0, 2 * G_PI); // Аналог четвёртой окружности
|
||
cairo_stroke(cr);
|
||
|
||
// 60 маленьких кружков
|
||
for (int i = 0; i < 60; i++) {
|
||
double angle = -i * 6 * G_PI / 180 + G_PI / 2;
|
||
double x = center_x + 170 * cos(angle);
|
||
double y = center_y - 170 * sin(angle);
|
||
cairo_arc(cr, x, y, 4, 0, 2 * G_PI);
|
||
cairo_fill(cr);
|
||
}
|
||
|
||
// 12 больших кружков
|
||
for (int i = 0; i < 12; i++) {
|
||
double angle = -i * 30 * G_PI / 180 + G_PI / 2;
|
||
double x = center_x + 185 * cos(angle);
|
||
double y = center_y - 185 * sin(angle);
|
||
cairo_set_line_width(cr, 3.0);
|
||
cairo_arc(cr, x, y, 9, 0, 2 * G_PI);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// 12 внешних кружков
|
||
for (int i = 0; i < 12; i++) {
|
||
double angle = -i * 30 * G_PI / 180 + G_PI / 2;
|
||
double x = center_x + 225 * cos(angle);
|
||
double y = center_y - 225 * sin(angle);
|
||
cairo_set_line_width(cr, 1.0);
|
||
cairo_arc(cr, x, y, 28, 0, 2 * G_PI);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Рисование линии для 1-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
cairo_move_to(cr, 454, 160); // Начальная точка линии
|
||
cairo_line_to(cr, 454, 191); // Конечная точка линии
|
||
cairo_stroke(cr);
|
||
|
||
// Рисование линии для 2-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
cairo_move_to(cr, 535, 244); // Начальная точка линии
|
||
cairo_line_to(cr, 535, 301); // Конечная точка линии
|
||
cairo_stroke(cr);
|
||
|
||
// Рисование треугольника для 3-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_3 = 567; // Центр треугольника
|
||
double center_y_3 = 384;
|
||
double radius_3 = 28;
|
||
for (int i = 0; i < 3; i++) {
|
||
double angle = -i * 120 * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_3 + radius_3 * cos(angle);
|
||
double y1 = center_y_3 - radius_3 * sin(angle);
|
||
int next_i = (i + 1) % 3;
|
||
double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_3 + radius_3 * cos(next_angle);
|
||
double y2 = center_y_3 - radius_3 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Рисование квадрата для 4-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_4 = 537; // Центр квадрата
|
||
double center_y_4 = 496;
|
||
double radius_4 = 28;
|
||
for (int i = 0; i < 4; i++) {
|
||
double angle = -i * 90 * G_PI / 180 + G_PI / 4; // Смещение на 45 градусов
|
||
double x1 = center_x_4 + radius_4 * cos(angle);
|
||
double y1 = center_y_4 - radius_4 * sin(angle);
|
||
int next_i = (i + 1) % 4;
|
||
double next_angle = -next_i * 90 * G_PI / 180 + G_PI / 4;
|
||
double x2 = center_x_4 + radius_4 * cos(next_angle);
|
||
double y2 = center_y_4 - radius_4 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Рисование пятиконечной звезды для 5-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_5 = 454; // Центр звезды
|
||
double center_y_5 = 579;
|
||
double radius_5 = 28;
|
||
for (int i = 0; i < 5; i++) {
|
||
double angle = -i * 144 * G_PI / 180 + G_PI / 2; // Угол поворота на 144 градуса
|
||
double x1 = center_x_5 + radius_5 * cos(angle);
|
||
double y1 = center_y_5 - radius_5 * sin(angle);
|
||
int next_i = (i + 1) % 5;
|
||
double next_angle = -next_i * 144 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_5 + radius_5 * cos(next_angle);
|
||
double y2 = center_y_5 - radius_5 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Рисование треугольника для 6-го часа (первый треугольник)
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_6 = 341; // Центр треугольника
|
||
double center_y_6 = 610;
|
||
double radius_6 = 28;
|
||
for (int i = 0; i < 3; i++) {
|
||
double angle = -i * 120 * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_6 + radius_6 * cos(angle);
|
||
double y1 = center_y_6 - radius_6 * sin(angle);
|
||
int next_i = (i + 1) % 3;
|
||
double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_6 + radius_6 * cos(next_angle);
|
||
double y2 = center_y_6 - radius_6 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Рисование второго треугольника для 6-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
for (int i = 0; i < 3; i++) {
|
||
double angle = -i * 120 * G_PI / 180 + G_PI / 6;
|
||
double x1 = center_x_6 + radius_6 * cos(angle);
|
||
double y1 = center_y_6 - radius_6 * sin(angle);
|
||
int next_i = (i + 1) % 3;
|
||
double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 6;
|
||
double x2 = center_x_6 + radius_6 * cos(next_angle);
|
||
double y2 = center_y_6 - radius_6 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Дополнительные линии для 6-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
cairo_move_to(cr, 326, 609);
|
||
cairo_line_to(cr, 358, 609);
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 332, 595);
|
||
cairo_line_to(cr, 349, 624);
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 349, 595);
|
||
cairo_line_to(cr, 332, 624);
|
||
cairo_stroke(cr);
|
||
|
||
// Рисование семиконечной звезды для 7-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_7 = 218; // Центр звезды
|
||
double center_y_7 = 579;
|
||
double radius_7 = 28;
|
||
for (int i = 0; i < 7; i++) {
|
||
double angle = -i * (360 / 7) * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_7 + radius_7 * cos(angle) + 10;
|
||
double y1 = center_y_7 - radius_7 * sin(angle) - 1;
|
||
int next_i = (i + 3) % 7; // Смещение на 3 шага для семиконечной звезды
|
||
double next_angle = -next_i * (360 / 7) * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_7 + radius_7 * cos(next_angle) + 10;
|
||
double y2 = center_y_7 - radius_7 * sin(next_angle) - 1;
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
/// --- *** 8 *** --------------------------------------
|
||
// Рисование двух квадратов для 8-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_8 = 147; // Центр для 8-го часа
|
||
double center_y_8 = 496;
|
||
double radius_8 = 28;
|
||
|
||
// Первый квадрат (0°, 90°, 180°, 270°)
|
||
for (int i = 0; i < 4; i++) {
|
||
double angle = -i * 90 * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_8 + radius_8 * cos(angle);
|
||
double y1 = center_y_8 - radius_8 * sin(angle);
|
||
int next_i = (i + 1) % 4;
|
||
double next_angle = -next_i * 90 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_8 + radius_8 * cos(next_angle);
|
||
double y2 = center_y_8 - radius_8 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Второй квадрат (45°, 135°, 225°, 315°)
|
||
for (int i = 0; i < 4; i++) {
|
||
double angle = -i * 90 * G_PI / 180 + G_PI / 4;
|
||
double x1 = center_x_8 + radius_8 * cos(angle);
|
||
double y1 = center_y_8 - radius_8 * sin(angle);
|
||
int next_i = (i + 1) % 4;
|
||
double next_angle = -next_i * 90 * G_PI / 180 + G_PI / 4;
|
||
double x2 = center_x_8 + radius_8 * cos(next_angle);
|
||
double y2 = center_y_8 - radius_8 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
/// --- *** 9 *** ---------------------------------------------
|
||
// Рисование трёх треугольников для 9-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_9 = 118; // Центр для 9-го часа
|
||
double center_y_9 = 384;
|
||
double radius_9 = 28;
|
||
|
||
// Первый треугольник (0° поворот)
|
||
for (int i = 0; i < 3; i++) {
|
||
double angle = -i * 120 * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_9 + radius_9 * cos(angle);
|
||
double y1 = center_y_9 - radius_9 * sin(angle);
|
||
int next_i = (i + 1) % 3;
|
||
double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_9 + radius_9 * cos(next_angle);
|
||
double y2 = center_y_9 - radius_9 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Второй треугольник (поворот на 40° вправо)
|
||
for (int i = 0; i < 3; i++) {
|
||
double angle = -i * 120 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 9;
|
||
double x1 = center_x_9 + radius_9 * cos(angle);
|
||
double y1 = center_y_9 - radius_9 * sin(angle);
|
||
int next_i = (i + 1) % 3;
|
||
double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 9;
|
||
double x2 = center_x_9 + radius_9 * cos(next_angle);
|
||
double y2 = center_y_9 - radius_9 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Третий треугольник (поворот на 40° влево)
|
||
for (int i = 0; i < 3; i++) {
|
||
double angle = -i * 120 * G_PI / 180 + G_PI / 2 - 2 * G_PI / 9;
|
||
double x1 = center_x_9 + radius_9 * cos(angle);
|
||
double y1 = center_y_9 - radius_9 * sin(angle);
|
||
int next_i = (i + 1) % 3;
|
||
double next_angle = -next_i * 120 * G_PI / 180 + G_PI / 2 - 2 * G_PI / 9;
|
||
double x2 = center_x_9 + radius_9 * cos(next_angle);
|
||
double y2 = center_y_9 - radius_9 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
/// --- *** 10 *** -----------------------------------------------------------
|
||
// Рисование двух пятиконечных звёзд для 10-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_10 = 147; // Центр для 10-го часа
|
||
double center_y_10 = 272; // Скорректировано для позиции 10-го часа
|
||
double radius_10 = 28;
|
||
|
||
// Первая звезда (нормальная ориентация)
|
||
for (int i = 0; i < 5; i++) {
|
||
double angle = -i * 144 * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_10 + radius_10 * cos(angle);
|
||
double y1 = center_y_10 - radius_10 * sin(angle);
|
||
int next_i = (i + 1) % 5;
|
||
double next_angle = -next_i * 144 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_10 + radius_10 * cos(next_angle);
|
||
double y2 = center_y_10 - radius_10 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Вторая звезда (перевёрнутая)
|
||
for (int i = 0; i < 5; i++) {
|
||
double angle = -i * 144 * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_10 + radius_10 * cos(angle);
|
||
double y1 = center_y_10 + radius_10 * sin(angle); // Знак изменён для перевёрнутой звезды
|
||
int next_i = (i + 1) % 5;
|
||
double next_angle = -next_i * 144 * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_10 + radius_10 * cos(next_angle);
|
||
double y2 = center_y_10 + radius_10 * sin(next_angle); // Знак изменён
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
/// --- *** 11 *** --------------------------------------------------------------------------
|
||
// Рисование одиннадцатиконечной звезды для 11-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
double center_x_11 = 230; // Центр для 11-го часа
|
||
double center_y_11 = 189; // Скорректировано для позиции 11-го часа
|
||
double radius_11 = 28;
|
||
|
||
for (int i = 0; i < 11; i++) {
|
||
double angle_increment = 360.0 / 11;
|
||
double angle = -i * angle_increment * G_PI / 180 + G_PI / 2;
|
||
double x1 = center_x_11 + radius_11 * cos(angle);
|
||
double y1 = center_y_11 - radius_11 * sin(angle);
|
||
int next_i = (i + 4) % 11; // Смещение на 4 шага для 11-конечной звезды
|
||
double next_angle = -next_i * angle_increment * G_PI / 180 + G_PI / 2;
|
||
double x2 = center_x_11 + radius_11 * cos(next_angle);
|
||
double y2 = center_y_11 - radius_11 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
/// --- *** 12 *** ---------------------------------------------------------------------------
|
||
// Рисование 12-го часа
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 1.0);
|
||
|
||
// Снежинка
|
||
cairo_move_to(cr, 326, 159); // 327, 98
|
||
cairo_line_to(cr, 359, 159); // 360, 98
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 333, 145); // 334, 84
|
||
cairo_line_to(cr, 350, 174); // 351, 113
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 350, 145); // 351, 84
|
||
cairo_line_to(cr, 333, 173); // 334, 112
|
||
cairo_stroke(cr);
|
||
|
||
// 12-угольник
|
||
double center_x_12 = 341; // Центр для 12-го часа (смещён относительно Python)
|
||
double center_y_12 = 159; // Скорректировано: 98 + (384 - 323)
|
||
double radius_12 = 28;
|
||
for (int i = 0; i < 12; i++) {
|
||
double angle = -i * 30 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 24; // Поворот на 15° (1/24 окружности)
|
||
double x1 = center_x_12 + radius_12 * cos(angle);
|
||
double y1 = center_y_12 - radius_12 * sin(angle);
|
||
int next_i = (i + 1) % 12;
|
||
double next_angle = -next_i * 30 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 24;
|
||
double x2 = center_x_12 + radius_12 * cos(next_angle);
|
||
double y2 = center_y_12 - radius_12 * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
|
||
// Первая группа линий
|
||
cairo_move_to(cr, 334, 132); // 335, 71 + (384 - 323)
|
||
cairo_line_to(cr, 334, 147); // 335, 86 + (384 - 323)
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 349, 132); // 350, 71
|
||
cairo_line_to(cr, 349, 147); // 350, 86
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 363, 139); // 364, 78
|
||
cairo_line_to(cr, 349, 147); // 350, 86
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 367, 152); // 368, 91
|
||
cairo_line_to(cr, 355, 159); // 356, 98
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 320, 139); // 321, 78
|
||
cairo_line_to(cr, 334, 147); // 335, 86
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 316, 152); // 317, 91
|
||
cairo_line_to(cr, 327, 159); // 328, 98
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 349, 170); // 350, 109
|
||
cairo_line_to(cr, 349, 187); // 350, 126
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 334, 170); // 335, 109
|
||
cairo_line_to(cr, 334, 187); // 335, 126
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 327, 160); // 328, 99
|
||
cairo_line_to(cr, 313, 167); // 314, 106
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 333, 172); // 334, 111
|
||
cairo_line_to(cr, 318, 179); // 319, 118
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 353, 159); // 354, 98
|
||
cairo_line_to(cr, 370, 167); // 371, 106
|
||
cairo_stroke(cr);
|
||
cairo_move_to(cr, 350, 171); // 351, 110
|
||
cairo_line_to(cr, 364, 180); // 365, 119
|
||
cairo_stroke(cr);
|
||
|
||
|
||
// Шестиконечная звезда
|
||
double radius_star = 16;
|
||
for (int i = 0; i < 6; i++) {
|
||
double angle = -i * 60 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 12; // Поворот на 30° (1/12 окружности)
|
||
double x1 = center_x_12 + radius_star * cos(angle);
|
||
double y1 = center_y_12 - radius_star * sin(angle);
|
||
int next_i = (i + 1) % 6;
|
||
double next_angle = -next_i * 60 * G_PI / 180 + G_PI / 2 + 2 * G_PI / 12;
|
||
double x2 = center_x_12 + radius_star * cos(next_angle);
|
||
double y2 = center_y_12 - radius_star * sin(next_angle);
|
||
cairo_move_to(cr, x1, y1);
|
||
cairo_line_to(cr, x2, y2);
|
||
cairo_stroke(cr);
|
||
}
|
||
/// --- *** 12 конец *** ---------------------------------------------------------------------------
|
||
///------------------------------------------------------------------------------------------
|
||
// Получение текущего времени
|
||
time_t rawtime;
|
||
struct tm *timeinfo;
|
||
time(&rawtime);
|
||
timeinfo = localtime(&rawtime);
|
||
int time_sec = timeinfo->tm_sec;
|
||
int time_min = timeinfo->tm_min;
|
||
int time_hour = timeinfo->tm_hour % 12; // 12-часовой формат
|
||
|
||
// Углы стрелок
|
||
double sec_angle = 6 * time_sec;
|
||
double min_angle = 6 * (time_min + (1.0 / 60) * time_sec);
|
||
double hour_angle = 30 * (time_hour + (1.0 / 60) * time_min);
|
||
|
||
// Секундная стрелка
|
||
cairo_set_source_rgb(cr, 0.68, 0.93, 0.93); // LightCyan
|
||
cairo_set_line_width(cr, 2.0);
|
||
double x_end_sec = center_x - radius * cos(sec_angle * G_PI / 180 + G_PI / 2);
|
||
double y_end_sec = center_y - radius * sin(sec_angle * G_PI / 180 + G_PI / 2);
|
||
cairo_move_to(cr, center_x, center_y);
|
||
cairo_line_to(cr, x_end_sec, y_end_sec);
|
||
cairo_stroke(cr);
|
||
|
||
// Минутная стрелка
|
||
cairo_set_line_width(cr, 3.0);
|
||
double minute_hand_length = 173;
|
||
double x_end_min = center_x - minute_hand_length * cos(min_angle * G_PI / 180 + G_PI / 2);
|
||
double y_end_min = center_y - minute_hand_length * sin(min_angle * G_PI / 180 + G_PI / 2);
|
||
cairo_move_to(cr, center_x, center_y);
|
||
cairo_line_to(cr, x_end_min, y_end_min);
|
||
cairo_stroke(cr);
|
||
|
||
// Часовая стрелка
|
||
cairo_set_line_width(cr, 5.0);
|
||
double hour_hand_length = 167;
|
||
double x_end_hour = center_x - hour_hand_length * cos(hour_angle * G_PI / 180 + G_PI / 2);
|
||
double y_end_hour = center_y - hour_hand_length * sin(hour_angle * G_PI / 180 + G_PI / 2);
|
||
cairo_move_to(cr, center_x, center_y);
|
||
cairo_line_to(cr, x_end_hour, y_end_hour);
|
||
cairo_stroke(cr);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
// Функция обновления часов
|
||
static gboolean update_clock(gpointer data) {
|
||
GtkWidget *drawing_area = GTK_WIDGET(data);
|
||
gtk_widget_queue_draw(drawing_area); // Перерисовка области
|
||
return TRUE; // Продолжать вызов
|
||
}
|
||
|
||
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, 716); // Размер как в Tkinter
|
||
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 *drawing_area = gtk_drawing_area_new();
|
||
gtk_widget_set_size_request(drawing_area, 683, 768); // Полный размер окна
|
||
gtk_overlay_add_overlay(GTK_OVERLAY(overlay), drawing_area);
|
||
gtk_widget_set_halign(drawing_area, GTK_ALIGN_CENTER);
|
||
gtk_widget_set_valign(drawing_area, GTK_ALIGN_CENTER);
|
||
|
||
// Подключаем функцию рисования и обновления
|
||
g_signal_connect(drawing_area, "draw", G_CALLBACK(draw_callback), NULL);
|
||
g_timeout_add(1000, update_clock, drawing_area); // Обновление каждую секунду
|
||
|
||
// CSS для прозрачности фона виджета
|
||
GtkCssProvider *provider = gtk_css_provider_new();
|
||
gtk_css_provider_load_from_data(provider,
|
||
"drawing-area {"
|
||
" background-color: transparent;"
|
||
"}",
|
||
-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 window.c -o window `pkg-config --cflags --libs gtk+-3.0` -lm
|