;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 ;###======================================================================================### ;###======================================================================================### ;###======================================================================================###