75 lines
1.9 KiB
Plaintext
75 lines
1.9 KiB
Plaintext
OPTION GUI TRUE
|
|
PRAGMA GUI gtk3
|
|
|
|
CONST HLEN = 140
|
|
CONST ALEN = 90
|
|
|
|
id = GUIDEFINE(" \
|
|
{ type=WINDOW name=window callback=delete-event resizable=0 title=\"Analog Clock\" } \
|
|
{ type=DRAWING_AREA name=drawing parent=window callback=draw width-request=300 height-request=300 } ")
|
|
|
|
WHILE TRUE
|
|
SELECT GUIEVENT$(id)
|
|
CASE "window"
|
|
BREAK
|
|
CASE "drawing"
|
|
CALL Draw
|
|
ENDSELECT
|
|
WEND
|
|
|
|
SUB Draw
|
|
|
|
LOCAL context TYPE GdkDrawingContext*
|
|
LOCAL cr TYPE cairo_t*
|
|
LOCAL gdk TYPE GdkWindow*
|
|
|
|
' Get drawing window
|
|
CALL GUIGET(id, "drawing", "window", &gdk)
|
|
|
|
' Setup drawing context
|
|
context = gdk_window_begin_draw_frame(gdk, gdk_window_get_clip_region(gdk))
|
|
|
|
' Get cairo context
|
|
cr = gdk_drawing_context_get_cairo_context(context)
|
|
|
|
' Clear
|
|
CALL cairo_set_source_rgba(cr, 1, 1, 1, 1)
|
|
CALL cairo_rectangle(cr, 0, 0, 300, 300)
|
|
CALL cairo_fill(cr)
|
|
|
|
' Draw centre
|
|
CALL cairo_set_source_rgba(cr, 0, 0, 0, 1)
|
|
CALL cairo_arc(cr, 150, 150, 10, 0, 2*PI)
|
|
CALL cairo_fill(cr)
|
|
|
|
' Draw second
|
|
s = SECOND(NOW)*6-90
|
|
CALL cairo_set_line_width(cr, 1)
|
|
CALL cairo_move_to(cr, 150, 150)
|
|
CALL cairo_line_to(cr, 150 + HLEN*COS(RAD(s)), 150 + HLEN*SIN(RAD(s)))
|
|
CALL cairo_stroke(cr)
|
|
CALL cairo_fill(cr)
|
|
|
|
' Draw minute
|
|
m = MINUTE(NOW)*6-90
|
|
CALL cairo_set_line_width(cr, 2)
|
|
CALL cairo_move_to(cr, 150, 150)
|
|
CALL cairo_line_to(cr, 150 + HLEN*COS(RAD(m)), 150 + HLEN*SIN(RAD(m)))
|
|
CALL cairo_stroke(cr)
|
|
CALL cairo_fill(cr)
|
|
|
|
' Draw hour
|
|
h = IIF(HOUR(NOW)>12, HOUR(NOW)-12, HOUR(NOW))*30+(MINUTE(NOW)/12)*6-90
|
|
CALL cairo_move_to(cr, 150, 150)
|
|
CALL cairo_line_to(cr, 150 + ALEN*COS(RAD(h)), 150 + ALEN*SIN(RAD(h)))
|
|
CALL cairo_stroke(cr)
|
|
CALL cairo_fill(cr)
|
|
|
|
' Finish drawing
|
|
CALL gdk_window_end_draw_frame(gdk, context)
|
|
|
|
' Draw each second
|
|
ALARM Draw, 1000
|
|
|
|
ENDSUB
|