; Name        : center.asm
; Build       : aclocal && autoconf && automake --add-missing --foreign
;               mkdir build
;               cd build
;               ../configure
;               make
; Description : a simple window centered on screen
; Source  : http://zetcode.com/gui/gtk2/firstprograms/

bits 64

[list -]
    %define    GTK_WINDOW_TOPLEVEL 0
    %define    GTK_WIN_POS_CENTER  1
    extern     exit
    extern     gtk_init
    extern     gtk_main
    extern     gtk_main_quit
    extern     gtk_window_new
    extern     gtk_window_set_title
    extern     gtk_window_set_default_size
    extern     gtk_window_set_position
    extern     gtk_widget_show
    extern     g_signal_connect_data
[list +]

section .rodata
    szTitle:       db  "center",0
    szDestroy:     db  "destroy",0

section .data
    window:        dq  0

section .text

global _start
    ;init gtk
    xor     rsi, rsi                    ;argv
    xor     rdi, rdi                    ;argc
    call    gtk_init
    ;create new window
    mov     rdi,GTK_WINDOW_TOPLEVEL
    call    gtk_window_new
    mov     qword[window],rax
    ;set window title
    mov     rdi,qword[window]
    mov     rsi,szTitle
    call    gtk_window_set_title
    ;set the window size
    mov     rdi,qword[window]
    mov     rsi,230
    mov     rdx,150
    call    gtk_window_set_default_size
    ;set window position
    mov     rdi,qword[window]
    mov     rsi,GTK_WIN_POS_CENTER
    call    gtk_window_set_position
    ;connect signal destroy to event handler gtk_main_quit
    xor     r9d,r9d                     ;combination of GConnectFlags 
    xor     r8d,r8d                     ;a GClosureNotify for data
    xor     rcx,rcx                     ;pointer to the data to pass
    mov     rdx,gtk_main_quit           ;pointer to the handler, exit = c function
    mov     rsi,szDestroy               ;pointer to the signal
    mov     rdi,qword[window]           ;pointer to the widget instance
    call    g_signal_connect_data       ;the value in RAX is the handler, but we don't store it now
    ;show the window
    mov     rdi,qword[window]
    call    gtk_widget_show
    ;enter main loop
    call    gtk_main
    ;exit program
    xor     rdi, rdi
    call    exit