;autor: yesma
;OPEN SOURCE
;program testowany na Linux Debian Lenny AMD_64
;============================================================================================
;make ./win lub	;nasm -f elf64 win.asm -o win.obj -I ./include
		;gcc win.obj -o win -L/usr/lib/ -lX11
;from 1-01-2009
; to 22-01-2009

%include "./include/X.inc"
%include "./include/Xlib.inc"
%include "./include/Xutil.inc"
%include "./include/keysymdef.inc"
%include "./include/makro.asm"
%include "./include/sys_macro_64.asm"

extern XResizeWindow

;###======================================================================================###
;###================================### DATA ###==========================================###
;###======================================================================================###
section .data

	win_Widt		equ 700
	win_Heig		equ 300

	win_Back		equ 0ffddaah
	border_Col		equ 0000000h
	menu_Color		equ 0ffffaah
	menu_All_Col		equ 000bbffh
	font_Col		equ 0005599h
	edit_Color		equ 0ffffddh
	highlight		equ 0eeeeeeh

	Menu_File		db 'File'
	Menu_File_len		equ $-Menu_File
	Menu_New		db 'New'
	Menu_New_len		equ $-Menu_New
	Menu_Open		db 'Open'
	Menu_Open_len		equ $-Menu_Open
	Menu_Save		db 'Save'
	Menu_Save_len		equ $-Menu_Save
	Menu_SaveAs		db 'Save As'
	Menu_SaveAs_len		equ $-Menu_SaveAs
	Menu_Close		db 'Close'
	Menu_Close_len		equ $-Menu_Close
	Menu_Edit		db 'Edit'
	Menu_Edit_len		equ $-Menu_Edit
	Menu_Copy		db '????'
	Menu_Copy_len		equ $-Menu_Copy

				;jak nie bedziesz mial takiej to zmien na inna iso8859-2
				;bo program nie bedzie dzilal
	font_name 		db 'terminus-iso8859-2-bold-20',0

	key_len			dd 1		;XLookupString zwraca 1 znak ascii
	font_width		dw 0
	font_height		dd 0
	ascent			dd 0
	descent			dd 0
;###======================================================================================###
;###===============================### BSS ###============================================###
;###======================================================================================###
section .bss

	root_win		resb Window
	win			resb Window
	Win_Edit_All		resb Window

	Win_Menu_File		resb Window
	Win_Menu_File_All	resb Window
	Win_Menu_New		resb Window
	Win_Menu_Open		resb Window
	Win_Menu_Save		resb Window
	Win_Menu_SaveAs		resb Window
	Win_Menu_Close		resb Window
	Win_Menu_Edit		resb Window
	Win_Menu_Edit_All	resb Window
	Win_Menu_Copy		resb Window

	GC_Menu			resb 8
	GC_Edit_All		resb 8
	GC_Enter		resb 8

	display			resq XPrivDisplay_size
	values			resq XGCValues_size
	our_font		resb XFontStruct_size
	our_char		resb XCharStruct_size
;	compose			resq XComposeStatus_size
;EVENTS ===============================================================
	event			resq XAnyEvent_size
	expose_event		resq XExposeEvent_size
	key_event		resq XKeyEvent_size
	button_event		resq XButtonEvent_size
	focus_in_event		resq XFocusChangeEvent_size
	focus_out_event		resq XFocusChangeEvent_size
;StructureNotifyMask ==================================================
	circulate_event		resq XCirculateEvent_size
	config_event		resq XConfigureEvent_size
	destroy_win_event	resq XDestroyWindowEvent_size
	gravity_event		resq XGravityEvent_size
	map_event		resq XMapEvent_size
	reparent_event		resq XReparentEvent_size
	unmap_event		resq XUnmapEvent_size
;=======================================================================
	screen_num		resb 4
	key			resb 8		;XLookupString zwraca znak ascii
	keysym_return		resb 8
	string_x		resb 4
	string_y		resb 4
	win_Edit_Widt		resb 4
	win_Edit_Heig		resb 4

	bufor			resb 131072;128kB
	counter			resb 4		;ile znakow w buforze
	counter_0		resb 4		;ile razy wykonac petle
	buf_0			resb 1		;bufor na 1 znak
	point			resb 4		;aktualne miejsce w buforze
;###======================================================================================###
;###==================================### CODE ###========================================###
;###======================================================================================###
section .text

	global main
main:
	init_app 0,display,screen_num,root_win
;###======================================================================================###
;###===============================### CREATE WINDOWS ###=================================###
;###======================================================================================###
;main window
	create_simple_window display,root_win,10,10,win_Widt,win_Heig,0,border_Col,win_Back,win
;Win_Edit_All
	create_simple_window display,win,3,28,1,1,1,border_Col,edit_Color,Win_Edit_All
;Win_Menu_File
	create_simple_window display,win,3,3,60,22,1,border_Col,menu_Color,Win_Menu_File
;Win_Menu_File_All
	create_simple_window display,win,3,28,90,114,1,border_Col,menu_All_Col,Win_Menu_File_All
;Win_Menu_New
	create_simple_window display,Win_Menu_File_All,0,0,90,22,0,border_Col,menu_Color,Win_Menu_New
;Win_Menu_Open	
	create_simple_window display,Win_Menu_File_All,0,23,90,22,0,border_Col,menu_Color,Win_Menu_Open
;Win_Menu_Save
	create_simple_window display,Win_Menu_File_All,0,46,90,22,0,border_Col,menu_Color,Win_Menu_Save
;Win_Menu_SaveAs
	create_simple_window display,Win_Menu_File_All,0,69,90,22,0,border_Col,menu_Color,Win_Menu_SaveAs
;Win_Menu_Close
	create_simple_window display,Win_Menu_File_All,0,92,90,22,0,border_Col,menu_Color,Win_Menu_Close
;Win_Menu_Edit
	create_simple_window display,win,68,3,60,22,1,border_Col,menu_Color,Win_Menu_Edit
;Win_Menu_Edit_All
	create_simple_window display,win,68,28,90,114,1,border_Col,menu_All_Col,Win_Menu_Edit_All
;Win_Menu_Copy
	create_simple_window display,Win_Menu_Edit_All,0,0,90,22,0,border_Col,menu_Color,Win_Menu_Copy
;===========================================================================================
;win
	select_input display,win,ExposureMask | ButtonPressMask | KeyPressMask |  StructureNotifyMask | FocusChangeMask
;Win_Edit_All
	select_input display,Win_Edit_All,ExposureMask | ButtonPressMask | KeyPressMask | FocusChangeMask 
;Win_Menu_File
	select_input display,Win_Menu_File,ExposureMask | ButtonPressMask | KeyPressMask | FocusChangeMask 
;Win_Menu_Edit
	select_input display,Win_Menu_Edit,ExposureMask | ButtonPressMask | KeyPressMask | FocusChangeMask 
;Win_Menu_New
	select_input display,Win_Menu_New,ExposureMask | ButtonPressMask
;Win_Menu_Open
	select_input display,Win_Menu_Open,ExposureMask | ButtonPressMask
;Win_Menu_Save
	select_input display,Win_Menu_Save,ExposureMask | ButtonPressMask
;Win_Menu_SaveAs
	select_input display,Win_Menu_SaveAs,ExposureMask | ButtonPressMask
;Win_Menu_Close
	select_input display,Win_Menu_Close,ExposureMask | ButtonPressMask
;Win_Menu_Copy
	select_input display,Win_Menu_Copy,ExposureMask | ButtonPressMask
;===========================================================================================
;win
	map_window display,win
;Win_Edit_All
	map_window display,Win_Edit_All
;Win_Menu_File
	map_window display,Win_Menu_File
;Win_Menu_Edit
	map_window display,Win_Menu_Edit
;###======================================================================================###
;###=================================### INIT VARS ###====================================###
;###======================================================================================###
;GC_Menu	### pamietaj o free gc
	mov qword [values + XGCValues.foreground],font_Col
	create_gc display,root_win,GCForeground,values,GC_Menu
;GC_Edit_All	### pamietaj o free gc
	mov qword [values + XGCValues.background],edit_Color
	create_gc display,root_win,GCBackground,values,GC_Edit_All
;GC_Enter	### pamietaj o free gc
	mov qword [values + XGCValues.background],edit_Color
	mov qword [values + XGCValues.foreground],edit_Color
	create_gc display,root_win,GCBackground | GCForeground,values,GC_Enter
;our_font	### pamietaj o free font

;tutaj pobieramy szerokosc fonty, obliczamy jej wysokosc pobieramy jej ascent descent,
;przeczytaj Xlib Programming Manual (O'Reilly & Associates, Inc.) .html
	load_query_font display,font_name,our_font
	mov rsi,[our_font]
	mov rax,[rsi + XFontStruct.min_bounds]
	mov [our_char],rax
	mov eax,[rsi + XFontStruct.ascent]
	mov [ascent],eax
	mov eax,[rsi + XFontStruct.descent]
	mov [descent],eax
	mov ax,[our_char + XCharStruct.width]
	mov [font_width],ax
	mov eax,[ascent]
	mov ebx,[descent]
	add eax,ebx
	mov [font_height],eax
;init text position in Win_Edit_All
	xor eax,eax
	mov [string_x],eax
	mov eax,[ascent]
	mov [string_y],eax
;set_fonts
	set_font display,GC_Menu,our_font
	set_font display,GC_Edit_All,our_font

;###======================================================================================###
;###================================### EVENT LOOP ###====================================###
;###======================================================================================###
;###=== bardzo ważne, jak dasz zamiat eax rax bedzie działał ale czesto sie zawiesza =====###
.event_loop:
	peak_event display,event
	mov eax,dword [event + XAnyEvent.type]
	;==============================
	cmp eax,Expose
	jz .exposeEvent_proc
	cmp eax,KeyPress
	jz .keyPress_proc
	cmp eax,ButtonPress
	jz .buttonPress_proc
	;StructureNotifyMask 7 * event
	cmp eax,CirculateNotify
	je .configureNotify
	cmp eax,ConfigureNotify
	je .configureNotify
	cmp eax,DestroyNotify
	je .destroyNotify
	cmp eax,GravityNotify
	je .gravityNotify
	cmp eax,MapNotify
	je .mapNotify
	cmp eax,ReparentNotify
	je .reparentNotify
	cmp eax,UnmapNotify
	je .unmapNotify
	;==============================
	cmp eax,FocusIn
	je .focusIn
	cmp eax,FocusOut
	je .focusOut
	;==============================
jmp .event_loop
;======================================
.exposeEvent_proc: 	jmp dword .ExposeEvent_proc
.keyPress_proc:		jmp dword .KeyPress_proc
.buttonPress_proc: 	jmp dword .ButtonPress_proc
.circulateNotify: 	jmp dword .CirculateNotify_proc
.configureNotify: 	jmp dword .ConfigureNotify_proc
.destroyNotify: 	jmp dword .DestroyNotify_proc
.gravityNotify: 	jmp dword .GravityNotify_proc
.mapNotify: 		jmp dword .MapNotify_proc
.reparentNotify: 	jmp dword .ReparentNotify_proc
.unmapNotify: 		jmp dword .UnmapNotify_proc
.focusIn: 		jmp dword .FocusIn_proc
.focusOut: 		jmp dword .FocusOut_proc
;###======================================================================================###
;###==============================### EXPOUSURE ###=======================================###
;###======================================================================================###
.ExposeEvent_proc:
	next_event display,expose_event
	mov rax,qword [expose_event + XExposeEvent.window]
	;==============================
	cmp rax,[win]
	je .expose_win
	cmp rax,[Win_Edit_All]
	je .expose_Edit_All
	cmp rax,[Win_Menu_File]
	je .expose_Menu_File
	cmp rax,[Win_Menu_Edit]
	je .expose_Menu_Edit
	;==============================
	cmp rax,[Win_Menu_New]
	je .expose_Menu_New
	cmp rax,[Win_Menu_Open]
	je .expose_Menu_Open
	cmp rax,[Win_Menu_Save]
	je .expose_Menu_Save
	cmp rax,[Win_Menu_SaveAs]
	je .expose_Menu_SaveAs
	cmp rax,[Win_Menu_Close]
	je .expose_Menu_Close
	;==============================
	cmp rax,[Win_Menu_Copy]
	je .expose_Menu_Copy
	;==============================
jmp .event_loop
;=====================================================
.expose_win:		jmp dword .Expose_Win
.expose_Edit_All:	jmp dword .Expose_Edit_All
.expose_Menu_File:	jmp dword .Expose_Menu_File
.expose_Menu_Edit:	jmp dword .Expose_Menu_Edit
.expose_Menu_New:	jmp dword .Expose_Menu_New
.expose_Menu_Open:	jmp dword .Expose_Menu_Open
.expose_Menu_Save:	jmp dword .Expose_Menu_Save
.expose_Menu_SaveAs:	jmp dword .Expose_Menu_SaveAs
.expose_Menu_Close:	jmp dword .Expose_Menu_Close
.expose_Menu_Copy:	jmp dword .Expose_Menu_Copy
;============================================================================================
.Expose_Win:				;### wszystkie puste w tym programie niepotrzebne

jmp .event_loop
;============================================================================================
.Expose_Menu_File:
	draw_string display,Win_Menu_File,GC_Menu,10,[ascent],Menu_File,Menu_File_len
jmp .event_loop
;============================================================================================
.Expose_Menu_Edit:
	draw_string display,Win_Menu_Edit,GC_Menu,10,[ascent],Menu_Edit,Menu_Edit_len
jmp .event_loop
;============================================================================================
.Expose_Edit_All:
	;clear jest konieczne, gdy urzywlem backspace bez tego pozostawaly pixele.
	;w oknie edycji po kazdym backspace wysylamy XSendEvent(expose)
	clear_window display,Win_Edit_All

	xor eax,eax			;ustawiamy kursor na poczatku okna
	mov [string_x],eax
	mov eax,[ascent]
	mov [string_y],eax

	mov eax,[counter]		;zliczył ile liter do tej pory napisane
	mov [counter_0],eax		;licznik powtorzeń petli
	cmp eax,0
	jne .bufor_niepusty
	jmp .event_loop
.bufor_niepusty:
	mov dword [point],0
.bufor_loop:				;piszemy z bufora po jednym znaku
	xor rax,rax
	mov ebx,[point]			;aktualne miejsce w buforze
	mov al,[bufor + ebx]
	mov [buf_0],al
	cmp al,0dh
	jne .nie_enter
	draw_image_string display,Win_Edit_All,GC_Enter,[string_x],[string_y],buf_0,1
	inc dword [point]
	jmp .bufor_enter
.nie_enter:
	draw_image_string display,Win_Edit_All,GC_Edit_All,[string_x],[string_y],buf_0,1
	inc dword [point]

	mov eax,[string_x]
	xor ebx,ebx
	mov bx,[font_width]
	add eax,ebx			;dleglosc poczatku jednej litery od nastepnej
	mov [string_x],eax
					;kalkulujemy szerokosc okienka z pozycja litery
					;zeby nie wychodzila poza obszar okienka
	add eax,ebx			;w eax kursor w ebx szerokosc fonty 
	cmp eax,[win_Edit_Widt]		;jesli eax+ebx mniejsze rowne szerokosc okna 
	jle .bufor_widac		;to piszemy w tej samej lini jesli wieksze
.bufor_enter:
	mov eax,[string_y]		;przenosimy do nastepnej lini.
	mov ebx,[font_height]
	add eax,ebx			;jesli nie to przenosimy do nastepnej linijki + 20px
	mov [string_y],eax
	mov dword [string_x],0
.bufor_widac:
	dec dword [counter_0]
	mov ecx,[counter_0]
	cmp ecx,0
	je .bufor_end
	jmp .bufor_loop
.bufor_end:
jmp .event_loop
;============================================================================================
.Expose_Menu_New:
	draw_string display,Win_Menu_New,GC_Menu,25,[ascent],Menu_New,Menu_New_len
jmp .event_loop
;============================================================================================
.Expose_Menu_Open:
	draw_string display,Win_Menu_Open,GC_Menu,20,[ascent],Menu_Open,Menu_Open_len
jmp .event_loop
;============================================================================================
.Expose_Menu_Save:
	draw_string display,Win_Menu_Save,GC_Menu,20,[ascent],Menu_Save,Menu_Save_len
jmp .event_loop
;============================================================================================
.Expose_Menu_SaveAs:
	draw_string display,Win_Menu_SaveAs,GC_Menu,8,[ascent],Menu_SaveAs,Menu_SaveAs_len
jmp .event_loop
;============================================================================================
.Expose_Menu_Close:
	draw_string display,Win_Menu_Close,GC_Menu,17,[ascent],Menu_Close,Menu_Close_len
jmp .event_loop
;============================================================================================
.Expose_Menu_Copy:
	draw_string display,Win_Menu_Copy,GC_Menu,20,[ascent],Menu_Copy,Menu_Copy_len
jmp .event_loop

;###======================================================================================###
;###==============================### FOCUS IN ###========================================###
;###======================================================================================###
.FocusIn_proc:
	next_event display,focus_in_event
	mov rax,qword [focus_in_event + XFocusChangeEvent.window]
	;==============================
	cmp rax,[win]
	je .fucusIn_win
	cmp rax,[Win_Edit_All]
	je .fucusIn_Edit_All
	cmp rax,[Win_Menu_File]
	je .fucusIn_Menu_File
	cmp rax,[Win_Menu_Edit]
	je .fucusIn_Menu_Edit
	;==============================
jmp .event_loop
;======================================================
.fucusIn_win:		jmp dword .FucusIn_Win
.fucusIn_Edit_All:	jmp dword .FucusIn_Edit_All
.fucusIn_Menu_File:	jmp dword .FucusIn_Menu_File
.fucusIn_Menu_Edit:	jmp dword .FucusIn_Menu_Edit
;============================================================================================
.FucusIn_Win:
jmp .event_loop
;============================================================================================
.FucusIn_Edit_All:
jmp .event_loop
;============================================================================================
.FucusIn_Menu_File:
	change_background display,Win_Menu_File,highlight
	map_window display,Win_Menu_File_All
	map_subwindows display,Win_Menu_File_All
	draw_string display,Win_Menu_File,GC_Menu,10,[ascent],Menu_File,Menu_File_len
jmp .event_loop
;============================================================================================
.FucusIn_Menu_Edit:
	change_background display,Win_Menu_Edit,highlight
	map_subwindows display,Win_Menu_Edit_All
	map_window display,Win_Menu_Edit_All
	draw_string display,Win_Menu_Edit,GC_Menu,10,[ascent],Menu_Edit,Menu_Edit_len
jmp .event_loop
;###======================================================================================###
;###================================### FOCUS OUT ###=====================================###
;###======================================================================================###
.FocusOut_proc:
	next_event display,focus_out_event
	mov rax,qword [focus_in_event + XFocusChangeEvent.window]
	;==============================
	cmp rax,[win]
	je .fucusOut_win
	cmp rax,[Win_Edit_All]
	je .fucusOut_Edit_All
	cmp rax,[Win_Menu_File]
	je .fucusOut_Menu_File
	cmp rax,[Win_Menu_Edit]
	je .fucusOut_Menu_Edit
	;==============================
jmp .event_loop
;======================================
.fucusOut_win:		jmp dword .FucusOut_Win
.fucusOut_Edit_All:	jmp dword .FucusOut_Edit_All
.fucusOut_Menu_File:	jmp dword .FucusOut_Menu_File
.fucusOut_Menu_Edit:	jmp dword .FucusOut_Menu_Edit
;============================================================================================
.FucusOut_Win:
jmp .event_loop
;============================================================================================
.FucusOut_Edit_All:
jmp .event_loop
;============================================================================================
.FucusOut_Menu_File:
	change_background display,Win_Menu_File,menu_Color
	unmap_subwindows display,Win_Menu_File_All
	unmap_window display,Win_Menu_File_All
	draw_string display,Win_Menu_File,GC_Menu,10,[ascent],Menu_File,Menu_File_len
jmp .event_loop
;============================================================================================
.FucusOut_Menu_Edit:
	change_background display,Win_Menu_Edit,menu_Color
	unmap_subwindows display,Win_Menu_Edit_All
	unmap_window display,Win_Menu_Edit_All
	draw_string display,Win_Menu_Edit,GC_Menu,10,[ascent],Menu_Edit,Menu_Edit_len
jmp .event_loop
;###======================================================================================###
;###==============================### KEYBORD ###=========================================###
;###======================================================================================###
.KeyPress_proc:
	next_event display,key_event
	mov rax,qword [key_event + XKeyEvent.window]
	;==============================
	cmp rax,[win]
	je .key_Win
	cmp rax,[Win_Menu_File]
	je .key_Menu_File
	cmp rax,[Win_Menu_Edit]
	je .key_Menu_Edit
	cmp rax,[Win_Edit_All]
	je .key_Edit_All
	;==============================
jmp .event_loop
;==========================================================
.key_Win:		jmp dword .Key_Win
.key_Menu_File:		jmp dword .Key_Menu_File
.key_Menu_Edit:		jmp dword .Key_Menu_Edit
.key_Edit_All:		jmp dword .Key_Edit_All
;============================================================================================
.Key_Win:
	lookup_string key_event,key,key_len,keysym_return,0;compose
;============================================
	cmp qword [keysym_return],XK_Escape		;zamyka program
	jne .Escape
	jmp .koniec
.Escape:
	cmp qword [keysym_return],XK_Tab		;przenosi fokus na nastepne okienko
	jne .Tab
	set_input_focus display,Win_Menu_File,RevertToParent,0
	jmp .event_loop
.Tab:
;============================================
	mov ax,word [keysym_return]
	cmp ax,XK_f					;otwiera menu file
	jne .alt_l_f
	mov eax,[key_event + XKeyEvent.state]
	cmp al,18h					;lewy alt bez caps lock
	jne .alt_l_f
	set_input_focus display,Win_Menu_File,RevertToParent,0
	jmp .event_loop
.alt_l_f:
	mov ax,word [keysym_return]
	cmp ax,XK_F					;otwiera menu file
	jne .alt_l_F
	mov eax,[key_event + XKeyEvent.state]
	cmp al,1Ah					;lewy alt z caps lock
	jne .alt_l_F
	set_input_focus display,Win_Menu_File,RevertToParent,0
	jmp .event_loop
.alt_l_F:
;============================================
	mov ax,word [keysym_return]
	cmp ax,XK_e					;otwiera menu edit
	jne .alt_l_e
	mov eax,[key_event + XKeyEvent.state]
	cmp al,18h					;lewy alt bez caps lock
	jne .alt_l_e
	set_input_focus display,Win_Menu_Edit,RevertToParent,0
	jmp .event_loop
.alt_l_e:
	mov ax,word [keysym_return]
	cmp ax,XK_E					;otwiera menu edit
	jne .alt_l_E
	mov eax,[key_event + XKeyEvent.state]
	cmp al,1Ah					;lewy alt z caps lock
	jne .alt_l_E
	set_input_focus display,Win_Menu_Edit,RevertToParent,0
	jmp .event_loop
.alt_l_E:
;==============
jmp .event_loop
;============================================================================================
.Key_Menu_File:
	lookup_string key_event,key,key_len,keysym_return,0;compose

	cmp qword [keysym_return],XK_Tab
	jne .Tab_File
	set_input_focus display,Win_Menu_Edit,RevertToParent,0
	jmp .event_loop
.Tab_File:
	cmp qword [keysym_return],XK_Escape
	jne .Escape_File
	set_input_focus display,win,RevertToParent,0
	jmp .event_loop
.Escape_File:
	cmp qword [keysym_return],XK_Right
	jne .Right_File
	set_input_focus display,Win_Menu_Edit,RevertToParent,0
	jmp .event_loop
.Right_File:
	cmp qword [keysym_return],XK_Left
	jne .Left_File
	set_input_focus display,Win_Menu_Edit,RevertToParent,0
	jmp .event_loop
.Left_File:
;==============
jmp .event_loop
;============================================================================================
.Key_Menu_Edit:
	lookup_string key_event,key,key_len,keysym_return,0;compose

	cmp qword [keysym_return],XK_Tab
	jne .Tab_Edit
	set_input_focus display,Win_Edit_All,RevertToParent,0
	jmp .event_loop
.Tab_Edit:
	cmp qword [keysym_return],XK_Escape
	jne .Escape_Edit
	set_input_focus display,win,RevertToParent,0
	jmp .event_loop
.Escape_Edit:
	cmp qword [keysym_return],XK_Right
	jne .Right_Edit
	set_input_focus display,Win_Menu_File,RevertToParent,0
	jmp .event_loop
.Right_Edit:
	cmp qword [keysym_return],XK_Left
	jne .Left_Edit
	set_input_focus display,Win_Menu_File,RevertToParent,0
	jmp .event_loop
.Left_Edit:

;==============
jmp .event_loop
;============================================================================================
.Key_Edit_All:
	lookup_string key_event,key,key_len,keysym_return,0;compose

	cmp qword [keysym_return],XK_Tab
	jne .Tab_Edit_All
	set_input_focus display,win,RevertToParent,0
	jmp .event_loop
.Tab_Edit_All:
	cmp qword [keysym_return],XK_Escape
	jne .Escape_Edit_All
	jmp .koniec
.Escape_Edit_All:

	cmp qword [keysym_return],XK_BackSpace
	je .jest_BackSpace
	jmp .BackSpace_Edit_All
.jest_BackSpace:			;usuwamy napisany znak
	cmp dword [counter],0
	jne .cos_jest
	jmp .event_loop
.cos_jest:				;cos jest w buf wiec mozemy to wybakspejsowac:)
	xor ebx,ebx
	mov eax,[string_x]
	mov bx,[font_width]
	sub eax,ebx			;cofamy kursor o szerokosc znaku
	mov [string_x],eax
	dec dword [counter]		;cofamy pozycje w buforze
	;tutaj wyswietlamy znak enter,kolor czcionki taki sam jak tla
	draw_image_string display,Win_Edit_All,GC_Enter,[string_x],[string_y],keysym_return,1
	send_event display,InputFocus,False,ExposureMask,expose_event
	jmp .event_loop
.BackSpace_Edit_All:
;==============================================================
	mov eax,[key_event + XKeyEvent.state]
;============================ z ctrl ==========================
	cmp al,14h
	jne .state_ctrl
	jmp .event_loop			;nie wyswietlamy znaku
.state_ctrl:
	cmp al,16h
	jne .state_ctrl_shift
	jmp .event_loop			;nie wyswietlamy znaku
.state_ctrl_shift:
;============================ z alt_l =========================
	cmp al,18h
	jne .state_alt_l
	jmp .event_loop			;nie wyswietlamy znaku
.state_alt_l:
	cmp al,1Ah
	jne .state_alt_l_shift
	jmp .event_loop			;nie wyswietlamy znaku
.state_alt_l_shift:
;============================ z alt_r, tu robimy spolszczenie =
	cmp al,90h
	jne .state_alt_r
	mov ax,word [keysym_return]
	and ah,0			;zerujemy ah bo bo X11 ma usrawiona jedynke
	jmp .napisz			;a w iso jest 0
.state_alt_r:
;===============================================================
	mov ax,[keysym_return]
	cmp ax,0FE03h			;KeySym Alt_r
	jne .czy_alt_r
	jmp .event_loop			;nie wyswietlamy alt
.czy_alt_r:
	mov ax,[keysym_return]
	cmp ax,XK_Return		;przenosimy kursor do nastepnej linijki
	jne .niema_enter
	;wyswietlamy enter ale jest niewidoczny,takie samo tlo jak kolor znaku
	draw_image_string display,Win_Edit_All,GC_Enter,[string_x],[string_y],keysym_return,1
	jmp .jesli_enter
.niema_enter:
	cmp ah,0ffh			;Functions keys nie wyswietlamy ich
	jne .ascii_char
	jmp .event_loop
.ascii_char:
;================================================================
.napisz:
	draw_image_string display,Win_Edit_All,GC_Edit_All,[string_x],[string_y],keysym_return,1

	xor ebx,ebx
	mov eax,[string_x]
	mov bx,[font_width]
	add eax,ebx			;dleglosc poczatku jednej litery od nastepnej
	mov [string_x],eax
					;kalkulujemy szerokosc okienka z pozycja litery
					;zeby nie wychodzila poza obszar okienka
	add eax,ebx			;w eax kursor w ebx szerokosc fonty 
	cmp eax,[win_Edit_Widt]		;jesli eax+ebx mniejsze rowne szerokosc okna 
	jle .widac			;to piszemy w tej samej lini jesli wieksze
.jesli_enter:
	mov eax,[string_y]		;przenosimy do nastepnej lini.
	mov ebx,[font_height]
	add eax,ebx			;jesli nie to przenosimy do nastepnej linijki + 20px
	mov [string_y],eax
	mov dword [string_x],0
.widac:
	mov ebx,[counter]		;ładujemy każdy wcisniety znak do bufora
	mov rax,[keysym_return]
	mov [bufor + ebx],al
	inc dword [counter]

jmp .event_loop
;###======================================================================================###
;###================================### MOUSE ###=========================================###
;###======================================================================================###
.ButtonPress_proc:
	next_event display,button_event
	mov rax,qword [button_event + XButtonEvent.window]
	;==============================
	cmp rax,[win]
	je .button_Win
	cmp rax,[Win_Menu_File]
	je .button_Menu_File
	cmp rax,[Win_Menu_New]
	je .button_Menu_New
	cmp rax,[Win_Menu_Open]
	je .button_Menu_Open
	cmp rax,[Win_Menu_Save]
	je .button_Menu_Save
	cmp rax,[Win_Menu_SaveAs]
	je .button_Menu_SaveAs
	cmp rax,[Win_Menu_Close]
	je .button_Menu_Close

	cmp rax,[Win_Menu_Edit]
	je .button_Menu_Edit
	cmp rax,[Win_Menu_Copy]
	je .button_Menu_Copy

	cmp rax,[Win_Edit_All]
	je .button_Edit_All
	;==============================
jmp .event_loop
;=====================================================
.button_Win:		jmp dword .Button_Win
.button_Menu_File:	jmp dword .Button_Menu_File
.button_Menu_New:	jmp dword .Button_Menu_New
.button_Menu_Open:	jmp dword .Button_Menu_Open
.button_Menu_Save:	jmp dword .Button_Menu_Save
.button_Menu_SaveAs:	jmp dword .Button_Menu_SaveAs
.button_Menu_Close:	jmp dword .Button_Menu_Close
.button_Menu_Edit:	jmp dword .Button_Menu_Edit
.button_Menu_Copy:	jmp dword .Button_Menu_Copy
.button_Edit_All:	jmp dword .Button_Edit_All
;============================================================================================
.Button_Win:				;### wszystkie puste w tym programie niepotrzebne
jmp .event_loop
;============================================================================================
.Button_Edit_All:
	set_input_focus display,Win_Edit_All,RevertToParent,0
jmp .event_loop
;============================================================================================
.Button_Menu_File:
	set_input_focus display,Win_Menu_File,RevertToParent,0
jmp .event_loop
;============================================================================================
.Button_Menu_New:

jmp .event_loop
;============================================================================================
.Button_Menu_Open:

jmp .event_loop
;============================================================================================
.Button_Menu_Save:

jmp .event_loop
;============================================================================================
.Button_Menu_SaveAs:

jmp .event_loop
;============================================================================================
.Button_Menu_Close:
jmp .koniec
;============================================================================================
.Button_Menu_Edit:
	set_input_focus display,Win_Menu_Edit,RevertToParent,0
jmp .event_loop
;============================================================================================
.Button_Menu_Copy:

jmp .event_loop
;###======================================================================================###
;###===================================###===###==========================================###
;###======================================================================================###
.CirculateNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,circulate_event
jmp .event_loop
;###======================================================================================###
;###==============================###= CONFIGURE WIN =###=================================###
;###======================================================================================###
.ConfigureNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,config_event

	mov eax,[config_event + XConfigureEvent.height]
	sub eax,32
	mov ecx,eax
	mov dword [win_Edit_Heig],eax
	mov eax,[config_event + XConfigureEvent.width]
	sub eax,8
	mov edx,eax
	mov dword [win_Edit_Widt],eax
	mov rsi,[Win_Edit_All]
	mov rdi,[display]
	call XResizeWindow

jmp .event_loop
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###
.DestroyNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,destroy_win_event
jmp .event_loop
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###
.GravityNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,gravity_event
jmp .event_loop
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###
.MapNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,map_event
jmp .event_loop
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###
.ReparentNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,reparent_event
jmp .event_loop
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###
.UnmapNotify_proc:;musi byc jesli StructureNotifyMask zostalo wybrane
	next_event display,unmap_event
jmp .event_loop
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###
;   ###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###=###
.koniec:
	free_font display,our_font
	free_gc display,GC_Menu
	free_gc display,GC_Edit_All
	free_gc display,GC_Enter
	close_display display
sys_exit
;###======================================================================================###
;###======================================================================================###
;###======================================================================================###