forked from KolibriOS/kolibrios
c-layer many fixes
git-svn-id: svn://kolibrios.org@6612 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
7a0442863e
commit
12a29e00e5
@ -12,10 +12,8 @@ include '../../../programs/system/run/trunk/txtbut.inc'
|
|||||||
include '../../../programs/dll.inc'
|
include '../../../programs/dll.inc'
|
||||||
|
|
||||||
public init_boxlib as '_kolibri_boxlib_init'
|
public init_boxlib as '_kolibri_boxlib_init'
|
||||||
public editbox_key_thunk as '_editbox_key@4' ; renamed due to ambiguity
|
|
||||||
public press_key as '_press_key'
|
|
||||||
;;; Returns 0 on success. -1 on failure.
|
|
||||||
|
|
||||||
|
;;; Returns 0 on success. -1 on failure.
|
||||||
proc init_boxlib
|
proc init_boxlib
|
||||||
pusha
|
pusha
|
||||||
mcall 68,11
|
mcall 68,11
|
||||||
@ -26,17 +24,21 @@ endp
|
|||||||
|
|
||||||
;; Wrapper to handle edit_box_key function for editboxes.
|
;; Wrapper to handle edit_box_key function for editboxes.
|
||||||
;; Call this baby from C (refer kolibri_editbox.h for details)
|
;; Call this baby from C (refer kolibri_editbox.h for details)
|
||||||
editbox_key_thunk:
|
;public editbox_key_thunk as '_editbox_key@4' ; renamed due to ambiguity
|
||||||
mov [oldebp], ebp ;Save ebp because GCC is crazy for it otherwise.
|
;public press_key as '_press_key'
|
||||||
pop ebp ;Save return address in ebp. Stack top is param now.
|
;; replaced by siemargl as inline ASM in C wrapper
|
||||||
mov eax, dword [press_key]
|
;editbox_key_thunk:
|
||||||
call [edit_box_key] ; The pointer we passed should be on the stack already.
|
; mov [oldebp], ebp ;Save ebp because GCC is crazy for it otherwise.
|
||||||
push ebp ;push the return address back to stack
|
; pop ebp ;Save return address in ebp. Stack top is param now.
|
||||||
mov ebp, [oldebp]
|
; mov eax, dword [press_key]
|
||||||
ret
|
; call [edit_box_key] ; The pointer we passed should be on the stack already.
|
||||||
|
; push ebp ;push the return address back to stack
|
||||||
|
; mov ebp, [oldebp]
|
||||||
|
; ret
|
||||||
|
;oldebp dd ?
|
||||||
|
;press_key dd ?
|
||||||
|
|
||||||
|
|
||||||
oldebp dd ?
|
|
||||||
press_key dd ?
|
|
||||||
|
|
||||||
@IMPORT:
|
@IMPORT:
|
||||||
library lib_boxlib, 'box_lib.obj'
|
library lib_boxlib, 'box_lib.obj'
|
||||||
|
@ -35,7 +35,8 @@ option_menu: option_menu.o
|
|||||||
kos32-objcopy $@ -O binary
|
kos32-objcopy $@ -O binary
|
||||||
|
|
||||||
boardmsg: boardmsg.o
|
boardmsg: boardmsg.o
|
||||||
$(LD) $(LIBPATH) --subsystem native -o $@ $^ $(OBJPATH)/loadboxlib.obj $(LDFLAGS)
|
$(LD) $(LIBPATH) --subsystem native -o $@ $^ $(OBJPATH)/loadboxlib.obj $(LDFLAGS) -Map=boardmsg.map
|
||||||
|
# strip $@
|
||||||
kos32-objcopy $@ -O binary
|
kos32-objcopy $@ -O binary
|
||||||
|
|
||||||
dbutton_files: dbutton_files.o
|
dbutton_files: dbutton_files.o
|
||||||
|
@ -69,9 +69,7 @@ int main()
|
|||||||
debug_board_write_str("\n");
|
debug_board_write_str("\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
press_key = key.val;
|
kolibri_handle_event_key(main_window, key);
|
||||||
|
|
||||||
kolibri_handle_event_key(main_window);
|
|
||||||
}
|
}
|
||||||
else if(gui_event == KOLIBRI_EVENT_BUTTON)
|
else if(gui_event == KOLIBRI_EVENT_BUTTON)
|
||||||
{
|
{
|
||||||
|
@ -109,7 +109,6 @@ int main(int argc, char **argv)
|
|||||||
brows.folder_data = read_folderdata("/rd/1");
|
brows.folder_data = read_folderdata("/rd/1");
|
||||||
brows.select_panel_counter = 1; // if want to show selection
|
brows.select_panel_counter = 1; // if want to show selection
|
||||||
|
|
||||||
int extended_key = 0, act = 0;
|
|
||||||
do /* Start of main activity loop */
|
do /* Start of main activity loop */
|
||||||
{
|
{
|
||||||
switch(gui_event)
|
switch(gui_event)
|
||||||
@ -124,44 +123,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
case KOLIBRI_EVENT_KEY:
|
case KOLIBRI_EVENT_KEY:
|
||||||
keypress = get_key();
|
keypress = get_key();
|
||||||
if(keypress.state) break;
|
filebrowser_key(&brows, keypress);
|
||||||
if (keypress.code == 0xE0){ extended_key = 1; break; }
|
|
||||||
|
|
||||||
act = 0;
|
|
||||||
switch(keypress.ctrl_key) // ascii scancode
|
|
||||||
{
|
|
||||||
case 80: // arrow down
|
|
||||||
act = 1; break;
|
|
||||||
case 72: // arrow up
|
|
||||||
act = 2; break;
|
|
||||||
case 81: // PageDown
|
|
||||||
act = 3; break;
|
|
||||||
case 73: // PageUp
|
|
||||||
act = 4; break;
|
|
||||||
case 71: // Home
|
|
||||||
act = 5; break;
|
|
||||||
case 79: // End
|
|
||||||
act = 6; break;
|
|
||||||
case 28: // Enter
|
|
||||||
act = 7; break;
|
|
||||||
case 82: // Insert
|
|
||||||
act = 8; break;
|
|
||||||
case 78: // NumPad+ select all
|
|
||||||
act = 9; break;
|
|
||||||
case 74: // NumPad- deselct
|
|
||||||
act = 10; break;
|
|
||||||
case 55: // NumPad* invert selection
|
|
||||||
act = 11; break;
|
|
||||||
default:
|
|
||||||
act = 12; // search by letter
|
|
||||||
}
|
|
||||||
brows.key_action = act;
|
|
||||||
brows.key_action_num = keypress.ctrl_key;
|
|
||||||
|
|
||||||
debug_board_printf("key pressed [%X] %d, action %d, ext_flag = %d\n", keypress.val, brows.key_action_num, act, extended_key);
|
|
||||||
|
|
||||||
if (extended_key) extended_key = 0;
|
|
||||||
(*filebrowse_key)(&brows);
|
|
||||||
//kolibri_handle_event_key(main_window);
|
//kolibri_handle_event_key(main_window);
|
||||||
break;
|
break;
|
||||||
case KOLIBRI_EVENT_BUTTON:
|
case KOLIBRI_EVENT_BUTTON:
|
||||||
|
@ -28,6 +28,15 @@ char fname[4096];
|
|||||||
char* load_file_inmem(char* fname, int32_t* read_sz); // see below
|
char* load_file_inmem(char* fname, int32_t* read_sz); // see below
|
||||||
char* load_image_file(char* fname); // see below
|
char* load_image_file(char* fname); // see below
|
||||||
|
|
||||||
|
void set_os_keyb_mode(int mode)
|
||||||
|
// 0 - ASCII, 1 - SCAN
|
||||||
|
{
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"int $0x40"
|
||||||
|
::"a"(66), "b"(1), "c"(mode));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
/* Load all libraries, initialize global tables like system color table and
|
/* Load all libraries, initialize global tables like system color table and
|
||||||
@ -36,6 +45,7 @@ int main(int argc, char **argv)
|
|||||||
elements can be used after a successful call to this function
|
elements can be used after a successful call to this function
|
||||||
*/
|
*/
|
||||||
kolibri_gui_init();
|
kolibri_gui_init();
|
||||||
|
set_os_keyb_mode(1); // scan code mode needed for editor
|
||||||
// kolibri_proclib_init(); // opensave && color dialogs
|
// kolibri_proclib_init(); // opensave && color dialogs
|
||||||
kolibri_libimg_init(); // png handling
|
kolibri_libimg_init(); // png handling
|
||||||
|
|
||||||
@ -43,7 +53,7 @@ int main(int argc, char **argv)
|
|||||||
uint32_t pressed_button = 0;
|
uint32_t pressed_button = 0;
|
||||||
// uint32_t mouse_button;
|
// uint32_t mouse_button;
|
||||||
// pos_t mouse_pos;
|
// pos_t mouse_pos;
|
||||||
oskey_t keypress;
|
// oskey_t keypress;
|
||||||
|
|
||||||
// make full path + argv
|
// make full path + argv
|
||||||
strcpy(run_path, argv[0]);
|
strcpy(run_path, argv[0]);
|
||||||
@ -55,12 +65,22 @@ int main(int argc, char **argv)
|
|||||||
kolibri_window *main_window = kolibri_new_window(50, 40, 490, 500, "Editor, TreeView and MsgBox demo");
|
kolibri_window *main_window = kolibri_new_window(50, 40, 490, 500, "Editor, TreeView and MsgBox demo");
|
||||||
|
|
||||||
editor *ed;
|
editor *ed;
|
||||||
editor *ed_lock;
|
void *ed_lock;
|
||||||
|
|
||||||
gui_add_editor(main_window, ed = kolibri_new_editor(X_Y(0, 440), X_Y(20, 150), 0x1001, 2048, &ed_lock));
|
gui_add_editor(main_window, ed = kolibri_new_editor(X_Y(0, 440), X_Y(20, 150), 0x11, 2048, &ed_lock)); // 0x11 font 8x16 sized x2
|
||||||
ed_lock = ed;
|
ed_lock = ed;
|
||||||
|
/*
|
||||||
|
// load sample file
|
||||||
|
int res, len;
|
||||||
|
res = editor_openfile(ed, "/rd/1/boardlog.txt", &len);
|
||||||
|
debug_board_printf("loaded sample file err=%d, len=%d\n", res, len);
|
||||||
|
*/
|
||||||
|
//adding sample text @cursor
|
||||||
|
char *sampletext = "==========ADDED SAMPLE TEXT==========\n";
|
||||||
|
(*ted_text_add)(ed, sampletext, strlen(sampletext), 0);
|
||||||
|
|
||||||
treelist *tl = kolibri_new_treelist(X_Y(0, 440), X_Y(200, 200), 16, X_Y(16, 16), 100, 50, 0, 0, TL_KEY_NO_EDIT | TL_DRAW_PAR_LINE, &ed_lock, 0x8080ff, 0x0000ff, 0xffffff);
|
// treelist as tree
|
||||||
|
treelist *tl = kolibri_new_treelist(X_Y(0, 200), X_Y(200, 200), 16, X_Y(16, 16), 100, 50, 0, 0, TL_KEY_NO_EDIT | TL_DRAW_PAR_LINE, &ed_lock, 0x8080ff, 0x0000ff, 0xffffff);
|
||||||
treelist_data_init(tl);
|
treelist_data_init(tl);
|
||||||
|
|
||||||
// ÷èòàåì ôàéë ñ êóðñîðàìè è ëèíèÿìè
|
// ÷èòàåì ôàéë ñ êóðñîðàìè è ëèíèÿìè
|
||||||
@ -75,8 +95,16 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
treelist_node_add(tl, "node1", 1, 0, 0); // ãäå 1 íîìåð èêîíêè ñ êíèãîé
|
treelist_node_add(tl, "node1", 1, 0, 0); // ãäå 1 íîìåð èêîíêè ñ êíèãîé
|
||||||
treelist_cursor_next(tl);
|
treelist_cursor_next(tl);
|
||||||
|
treelist_node_add(tl, "node1.1", 1, 0, 1);
|
||||||
|
treelist_cursor_next(tl);
|
||||||
|
treelist_node_add(tl, "node1.1.1", 0, 0, 2);
|
||||||
|
treelist_cursor_next(tl);
|
||||||
|
treelist_node_add(tl, "node1.2", 1, 0, 1);
|
||||||
|
treelist_cursor_next(tl);
|
||||||
|
|
||||||
treelist_node_add(tl, "node2", 1, 0, 0);
|
treelist_node_add(tl, "node2", 1, 1, 0); // closed node
|
||||||
|
treelist_cursor_next(tl);
|
||||||
|
treelist_node_add(tl, "node2.1", 1, 0, 1);
|
||||||
treelist_cursor_next(tl);
|
treelist_cursor_next(tl);
|
||||||
|
|
||||||
treelist_node_add(tl, "node3", 1, 0, 0);
|
treelist_node_add(tl, "node3", 1, 0, 0);
|
||||||
@ -85,8 +113,28 @@ int main(int argc, char **argv)
|
|||||||
treelist_cursor_begin(tl); //;ñòàâèì êóðñîð íà íà÷àëî ñïèñêà
|
treelist_cursor_begin(tl); //;ñòàâèì êóðñîð íà íà÷àëî ñïèñêà
|
||||||
gui_add_treelist(main_window, tl);
|
gui_add_treelist(main_window, tl);
|
||||||
|
|
||||||
|
// treelist as listbox
|
||||||
|
treelist *tl2 = kolibri_new_treelist(X_Y(220, 200), X_Y(200, 200), 16, X_Y(16, 16), 100, 50, 0, 0, TL_LISTBOX_MODE, &ed_lock, 0x8080ff, 0x0000ff, 0xffffff);
|
||||||
|
treelist_data_init(tl2);
|
||||||
|
|
||||||
|
tl2->data_img_sys = tl->data_img_sys;
|
||||||
|
tl2->data_img = tl->data_img;
|
||||||
|
|
||||||
|
treelist_node_add(tl2, "list1", 0, 0, 0); // ãäå 1 íîìåð èêîíêè ñ êíèãîé
|
||||||
|
treelist_cursor_next(tl2);
|
||||||
|
|
||||||
|
treelist_node_add(tl2, "list2", 0, 0, 0);
|
||||||
|
treelist_cursor_next(tl2);
|
||||||
|
|
||||||
|
treelist_node_add(tl2, "list3", 0, 0, 0);
|
||||||
|
treelist_cursor_next(tl2);
|
||||||
|
|
||||||
|
treelist_cursor_begin(tl2); //;ñòàâèì êóðñîð íà íà÷àëî ñïèñêà
|
||||||
|
gui_add_treelist(main_window, tl2);
|
||||||
|
|
||||||
msgbox* box = kolibri_new_msgbox("Exit", "Are\rYOU\rSure?", 3, "YES", "Absolute", "Not Yet", NULL); // default NOT
|
msgbox* box = kolibri_new_msgbox("Exit", "Are\rYOU\rSure?", 3, "YES", "Absolute", "Not Yet", NULL); // default NOT
|
||||||
|
|
||||||
|
oskey_t key;
|
||||||
do /* Start of main activity loop */
|
do /* Start of main activity loop */
|
||||||
{
|
{
|
||||||
switch(gui_event)
|
switch(gui_event)
|
||||||
@ -99,10 +147,20 @@ int main(int argc, char **argv)
|
|||||||
case KOLIBRI_EVENT_NONE:
|
case KOLIBRI_EVENT_NONE:
|
||||||
break;
|
break;
|
||||||
case KOLIBRI_EVENT_KEY:
|
case KOLIBRI_EVENT_KEY:
|
||||||
|
key = get_key();
|
||||||
|
trap(0x55); // for stop in debug
|
||||||
if (ed_lock == ed)
|
if (ed_lock == ed)
|
||||||
editor_key(ed);
|
editor_key(ed, key);
|
||||||
|
else if(ed_lock == tl)
|
||||||
|
{
|
||||||
|
treelist_key(tl, key);
|
||||||
|
}
|
||||||
|
else if(ed_lock == tl2)
|
||||||
|
{
|
||||||
|
treelist_key(tl2, key);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
kolibri_handle_event_key(main_window);
|
kolibri_handle_event_key(main_window, key);
|
||||||
break;
|
break;
|
||||||
case KOLIBRI_EVENT_BUTTON:
|
case KOLIBRI_EVENT_BUTTON:
|
||||||
pressed_button = get_os_button();
|
pressed_button = get_os_button();
|
||||||
|
@ -134,7 +134,7 @@ int main()
|
|||||||
case KOLIBRI_EVENT_KEY:
|
case KOLIBRI_EVENT_KEY:
|
||||||
keypress = get_key();
|
keypress = get_key();
|
||||||
debug_board_printf("Key pressed state(%d) code(%d) ctrl_key(%d) modifiers(%#x)\n", keypress.state, keypress.code, keypress.ctrl_key, get_os_keyb_modifiers());
|
debug_board_printf("Key pressed state(%d) code(%d) ctrl_key(%d) modifiers(%#x)\n", keypress.state, keypress.code, keypress.ctrl_key, get_os_keyb_modifiers());
|
||||||
kolibri_handle_event_key(main_window); // ???????
|
kolibri_handle_event_key(main_window, keypress);
|
||||||
|
|
||||||
if(keypress.code == SCAN_CODE_ALTM && get_os_keyb_modifiers() & (KEY_LALT | KEY_RALT))
|
if(keypress.code == SCAN_CODE_ALTM && get_os_keyb_modifiers() & (KEY_LALT | KEY_RALT))
|
||||||
(*menu_bar_activate)(menu1); // wont work, immediately redraw command closes menu ( . but Alt+F1 worked in opendial.asm:463
|
(*menu_bar_activate)(menu1); // wont work, immediately redraw command closes menu ( . but Alt+F1 worked in opendial.asm:463
|
||||||
|
@ -147,7 +147,7 @@ int main()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
kolibri_handle_event_key(main_window); // ???????
|
kolibri_handle_event_key(main_window, keypress);
|
||||||
break;
|
break;
|
||||||
case KOLIBRI_EVENT_BUTTON:
|
case KOLIBRI_EVENT_BUTTON:
|
||||||
pressed_button = get_os_button();
|
pressed_button = get_os_button();
|
||||||
|
@ -21,7 +21,8 @@ kolibri_button *kolibri_new_button(unsigned int tlx, unsigned int tly, unsigned
|
|||||||
return new_button;
|
return new_button;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_button(kolibri_button *some_button)
|
__attribute__((__stdcall__))
|
||||||
|
static inline void draw_button(kolibri_button *some_button)
|
||||||
{
|
{
|
||||||
define_button(some_button -> x65536sizex, some_button -> y65536sizey, some_button -> identifier, some_button -> color);
|
define_button(some_button -> x65536sizex, some_button -> y65536sizey, some_button -> identifier, some_button -> color);
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
/* Write a printf() like function (variable argument list) for
|
/* Write a printf() like function (variable argument list) for
|
||||||
writing to debug board */
|
writing to debug board */
|
||||||
|
|
||||||
inline void debug_board_write_byte(const char ch){
|
static inline void debug_board_write_byte(const char ch){
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"int $0x40"
|
"int $0x40"
|
||||||
:
|
:
|
||||||
@ -22,7 +22,7 @@ void __attribute__ ((noinline)) debug_board_write_str(const char* str){
|
|||||||
debug_board_write_byte(*str++);
|
debug_board_write_byte(*str++);
|
||||||
}
|
}
|
||||||
|
|
||||||
void debug_board_printf(const char *format,...)
|
static inline void debug_board_printf(const char *format,...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char log_board[300];
|
char log_board[300];
|
||||||
@ -33,4 +33,13 @@ void debug_board_printf(const char *format,...)
|
|||||||
debug_board_write_str(log_board);
|
debug_board_write_str(log_board);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__ ((noinline)) void trap(int n)
|
||||||
|
{
|
||||||
|
// nothing todo, just see n in debugger. use "bp trap" command
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"nop"
|
||||||
|
:
|
||||||
|
:"a"(n));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* KOLIBRI_DEBUG_H */
|
#endif /* KOLIBRI_DEBUG_H */
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
/* flags meaning
|
/* flags meaning
|
||||||
ed_figure_only= 1000000000000000b ;îäíè ñèìâîëû
|
ed_figure_only= 1000000000000000b ;îäíè ñèìâîëû
|
||||||
ed_always_focus= 100000000000000b
|
ed_always_focus= 100000000000000b // âñåãäà ñ êóðñîðîì (ôîêóñîì)
|
||||||
ed_focus= 10b ;ôîêóñ ââîäà ïðèëîæåíèÿ
|
ed_focus= 10b ;ôîêóñ ââîäà ïðèëîæåíèÿ, ìûøèòñÿ ñàìîñòîÿòåëüíî
|
||||||
ed_pass= 1b ;ïîëå ñ ïàðîëåì
|
ed_pass= 1b ;ïîëå ñ ïàðîëåì
|
||||||
ed_shift_on= 1000b ;åñëè íå óñòàíîâëåí -çíà÷èò âïåðâûå íàæàò shift,åñëè áûë óñòàíîâëåí, çíà÷èò ìû óæå ÷òî - òî äåëàëè óäåðæèâàÿ shift
|
ed_shift_on= 1000b ;åñëè íå óñòàíîâëåí -çíà÷èò âïåðâûå íàæàò shift,åñëè áûë óñòàíîâëåí, çíà÷èò ìû óæå ÷òî - òî äåëàëè óäåðæèâàÿ shift
|
||||||
ed_shift_on_off=1111111111110111b
|
ed_shift_on_off=1111111111110111b
|
||||||
@ -44,7 +44,7 @@ typedef struct edit_box_t {
|
|||||||
unsigned int text_color;
|
unsigned int text_color;
|
||||||
unsigned int max;
|
unsigned int max;
|
||||||
char *text;
|
char *text;
|
||||||
struct edit_box_t** mouse_variable; // must be pointer edit_box** to save focused editbox
|
void *mouse_variable; // must be pointer edit_box** to save focused editbox
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
||||||
unsigned int size; // used symbols in buffer without trailing zero
|
unsigned int size; // used symbols in buffer without trailing zero
|
||||||
@ -72,7 +72,7 @@ typedef struct edit_box_t {
|
|||||||
max_chars = Limit of number of characters user can enter into edit box.
|
max_chars = Limit of number of characters user can enter into edit box.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
edit_box* kolibri_new_edit_box(unsigned int tlx, unsigned int tly, unsigned int max_chars, edit_box **editbox_interlock)
|
edit_box* kolibri_new_edit_box(unsigned int tlx, unsigned int tly, unsigned int max_chars, void *editbox_interlock)
|
||||||
{
|
{
|
||||||
unsigned int PIXELS_PER_CHAR = 7;
|
unsigned int PIXELS_PER_CHAR = 7;
|
||||||
edit_box *new_textbox = (edit_box *)calloc(1, sizeof(edit_box));
|
edit_box *new_textbox = (edit_box *)calloc(1, sizeof(edit_box));
|
||||||
@ -99,12 +99,24 @@ edit_box* kolibri_new_edit_box(unsigned int tlx, unsigned int tly, unsigned int
|
|||||||
|
|
||||||
extern void (*edit_box_draw)(edit_box *) __attribute__((__stdcall__));
|
extern void (*edit_box_draw)(edit_box *) __attribute__((__stdcall__));
|
||||||
|
|
||||||
|
extern void (*edit_box_key)(edit_box *) __attribute__((__stdcall__));
|
||||||
/* editbox_key is a wrapper written in assembly to handle key press events for editboxes */
|
/* editbox_key is a wrapper written in assembly to handle key press events for editboxes */
|
||||||
/* because inline assembly in GCC is a PITA and interferes with the EAX (AH) register */
|
/* because inline assembly in GCC is a PITA and interferes with the EAX (AH) register */
|
||||||
/* which edit_box_key requires */
|
/* which edit_box_key requires */
|
||||||
extern void editbox_key(edit_box *) __attribute__((__stdcall__));
|
__attribute__((__stdcall__)) void editbox_key(edit_box *e, oskey_t ch)
|
||||||
|
/// åñëè flags íå ñîäåðæèò ed_focus, èãíîðèðóåò ââîä
|
||||||
|
/// åñëè flags ñîäåðæèò ed_mouse_on èëè ed_disabled, èãíîðèðóåò ââîä
|
||||||
|
/// íà ââîäå îæèäàåò ch - êîä êëàâèøè, òîëüêî â ðåæèìå ASCII
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"push %2\n\t"
|
||||||
|
"call *%1 \n\t"::"a"(ch.val), "m"(edit_box_key), "m"(e):);
|
||||||
|
}
|
||||||
|
|
||||||
extern void (*edit_box_mouse)(edit_box *) __attribute__((__stdcall__));
|
extern void (*edit_box_mouse)(edit_box *) __attribute__((__stdcall__));
|
||||||
|
/// ïðè ùåë÷êå íå ëåâîé êíîïêîé, îáíóëÿåò *mouse_variable! è ñáðàñûâàåò ôëàã ed_mouse_on
|
||||||
|
|
||||||
|
|
||||||
extern void (*edit_box_set_text)(edit_box *, char *) __attribute__((__stdcall__));
|
extern void (*edit_box_set_text)(edit_box *, char *) __attribute__((__stdcall__));
|
||||||
extern volatile unsigned press_key;
|
extern volatile unsigned press_key;
|
||||||
#endif /* KOLIBRI_EDITBOX_H */
|
#endif /* KOLIBRI_EDITBOX_H */
|
||||||
|
@ -24,8 +24,8 @@ typedef struct __attribute__ ((__packed__)) {
|
|||||||
uint32_t y_pos; //50
|
uint32_t y_pos; //50
|
||||||
uint32_t width; //440
|
uint32_t width; //440
|
||||||
uint32_t hight; //150
|
uint32_t hight; //150
|
||||||
uint32_t w_pane; //30 øèðèíà ïàíåëè â îêíå
|
uint32_t w_pane; //30 øèðèíà ïàíåëè â îêíå, width of left pane with line numbers
|
||||||
uint32_t h_pane; //25 âûñîòà ïàíåëè â îêíå
|
uint32_t h_pane; //25 âûñîòà ïàíåëè â îêíå, hight of top pane with Rows, Cols Undo info
|
||||||
uint32_t width_sym; //9 øèðèíà ñèìâîëà (çíàêîìåñòà) â îêíå
|
uint32_t width_sym; //9 øèðèíà ñèìâîëà (çíàêîìåñòà) â îêíå
|
||||||
uint32_t hight_sym; //16 âûñîòà ñèìâîëà (çíàêîìåñòà) â îêíå
|
uint32_t hight_sym; //16 âûñîòà ñèìâîëà (çíàêîìåñòà) â îêíå
|
||||||
uint8_t drag_m; // âûäåëåíèå îò ìûøè
|
uint8_t drag_m; // âûäåëåíèå îò ìûøè
|
||||||
@ -285,15 +285,21 @@ enum control_keys {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern void (*ted_key_asm)(editor *, char* table, int control) __attribute__((__stdcall__));
|
extern void (*ted_key_asm)(editor *, char* table, int control) __attribute__((__stdcall__));
|
||||||
static inline void editor_keyboard(editor *ed, char* table, enum control_keys control, int ch)
|
static inline __attribute__((__stdcall__)) void editor_keyboard(editor *ed, char* table, enum control_keys control, int ch)
|
||||||
/// control is KM_SHIFT, KM_ALT, KM_CTRL, KM_NUMLOCK,
|
/// control is KM_SHIFT, KM_ALT, KM_CTRL, KM_NUMLOCK,
|
||||||
/// ch = GET_KEY
|
/// ch = GET_KEY
|
||||||
/// table = SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT
|
/// table = SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT
|
||||||
{
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"push %4\n\t"
|
||||||
|
"push %3\n\t"
|
||||||
|
"push %2\n\t"
|
||||||
|
"call *%1 \n\t"::"a"(ch), "m"(ted_key_asm), "m"(ed), "m"(table), "m"(control):);
|
||||||
|
/*
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"nop \n\t"::"a"(ch):);
|
"nop \n\t"::"a"(ch):);
|
||||||
|
|
||||||
(*ted_key_asm)(ed, table, control);
|
(*ted_key_asm)(ed, table, control);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void (*ted_open_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__));
|
extern void (*ted_open_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__));
|
||||||
@ -410,10 +416,12 @@ int get_keyboard_layout(int opt, char* buf)
|
|||||||
return lang;
|
return lang;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__attribute__((__stdcall__))
|
||||||
static void editor_key(editor* ed)
|
static void editor_key(editor* ed, oskey_t key)
|
||||||
// callback for gui
|
// callback for gui
|
||||||
{
|
{
|
||||||
|
//if(ed->el_focus != ed) return; // need to check not to lose keyb buffer
|
||||||
|
|
||||||
uint32_t control = get_control_keys();
|
uint32_t control = get_control_keys();
|
||||||
enum control_keys ed_ctrl = 0;
|
enum control_keys ed_ctrl = 0;
|
||||||
int ly_opt = 1;
|
int ly_opt = 1;
|
||||||
@ -425,7 +433,7 @@ static void editor_key(editor* ed)
|
|||||||
char conv_table[128];
|
char conv_table[128];
|
||||||
get_keyboard_layout(ly_opt, conv_table);
|
get_keyboard_layout(ly_opt, conv_table);
|
||||||
|
|
||||||
editor_keyboard(ed, conv_table, ed_ctrl, get_key().val);
|
editor_keyboard(ed, conv_table, ed_ctrl, key.val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gui_add_editor(kolibri_window *wnd, editor* e)
|
static inline void gui_add_editor(kolibri_window *wnd, editor* e)
|
||||||
@ -433,7 +441,7 @@ static inline void gui_add_editor(kolibri_window *wnd, editor* e)
|
|||||||
kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e);
|
kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t font, uint32_t max_chars, editor **editor_interlock)
|
static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t font, uint32_t max_chars, void *editor_interlock)
|
||||||
/// font - 0b10SSS 8x16 size multiply (SSS+1), 0xSSS - 6x9 multiply (SSS+1)
|
/// font - 0b10SSS 8x16 size multiply (SSS+1), 0xSSS - 6x9 multiply (SSS+1)
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -443,7 +451,8 @@ static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t fo
|
|||||||
ed->y_pos = y_h >> 16;
|
ed->y_pos = y_h >> 16;
|
||||||
ed->hight = y_h & 0xFFFF;
|
ed->hight = y_h & 0xFFFF;
|
||||||
|
|
||||||
// no panel, w_pane, h_pane == 0
|
ed->w_pane = 30;
|
||||||
|
ed->h_pane = 20;
|
||||||
// font
|
// font
|
||||||
if (font == 0) font = 0x10; // default 16 = 8x16
|
if (font == 0) font = 0x10; // default 16 = 8x16
|
||||||
int font_multipl = (font & 7) + 1;
|
int font_multipl = (font & 7) + 1;
|
||||||
@ -472,8 +481,8 @@ static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t fo
|
|||||||
*/
|
*/
|
||||||
ed->symbol_new_line = 20; // ascii(20)
|
ed->symbol_new_line = 20; // ascii(20)
|
||||||
|
|
||||||
ed->scr_w = kolibri_new_scrollbar_def(X_Y(50, 16), X_Y(50, 300), 100, 30, 0);
|
ed->scr_w = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0); // cur_area will be inited ltr, max & pos undef
|
||||||
ed->scr_h = kolibri_new_scrollbar_def(X_Y(0, 150), X_Y(50, 16), 100, 30, 0);
|
ed->scr_h = kolibri_new_scrollbar_def(X_Y(0, 0), X_Y(0, 16), 100, 30, 0); // cur_area will be inited ltr, max & pos undef
|
||||||
|
|
||||||
ed->buffer_size = TE_BUF_SIZE;
|
ed->buffer_size = TE_BUF_SIZE;
|
||||||
ed->buffer = malloc(TE_BUF_SIZE);
|
ed->buffer = malloc(TE_BUF_SIZE);
|
||||||
@ -483,6 +492,8 @@ static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t fo
|
|||||||
ed->mode_color = 1; // can select text
|
ed->mode_color = 1; // can select text
|
||||||
ed->mode_invis = 1; // show nonprinted symbols
|
ed->mode_invis = 1; // show nonprinted symbols
|
||||||
|
|
||||||
|
ed->el_focus = editor_interlock;
|
||||||
|
|
||||||
// ??? saveregs ax,cx,di
|
// ??? saveregs ax,cx,di
|
||||||
editor_init(ed); // memory allocation, cleaning
|
editor_init(ed); // memory allocation, cleaning
|
||||||
ed->syntax_file = (char*)&default_syntax;
|
ed->syntax_file = (char*)&default_syntax;
|
||||||
|
@ -226,4 +226,52 @@ extern void (*filebrowse_draw)(filebrowser *) __attribute__((__stdcall__));
|
|||||||
extern void (*filebrowse_key)(filebrowser *) __attribute__((__stdcall__));
|
extern void (*filebrowse_key)(filebrowser *) __attribute__((__stdcall__));
|
||||||
extern void (*filebrowse_mouse)(filebrowser *) __attribute__((__stdcall__));
|
extern void (*filebrowse_mouse)(filebrowser *) __attribute__((__stdcall__));
|
||||||
|
|
||||||
|
__attribute__((__stdcall__)) static inline void filebrowser_key(filebrowser *fb, oskey_t keypress)
|
||||||
|
/// wrapper for key, translate keypress (ASCII mode) to action for browser
|
||||||
|
{
|
||||||
|
// if (!fb->select_flag) return; // same reaction as other controls
|
||||||
|
|
||||||
|
int extended_key = 0, act = 0;
|
||||||
|
|
||||||
|
if(keypress.state) return;
|
||||||
|
if (keypress.code == 0xE0){ extended_key = 1; return; }
|
||||||
|
|
||||||
|
act = 0;
|
||||||
|
switch(keypress.ctrl_key) // ascii scancode
|
||||||
|
{
|
||||||
|
case 80: // arrow down
|
||||||
|
act = 1; break;
|
||||||
|
case 72: // arrow up
|
||||||
|
act = 2; break;
|
||||||
|
case 81: // PageDown
|
||||||
|
act = 3; break;
|
||||||
|
case 73: // PageUp
|
||||||
|
act = 4; break;
|
||||||
|
case 71: // Home
|
||||||
|
act = 5; break;
|
||||||
|
case 79: // End
|
||||||
|
act = 6; break;
|
||||||
|
case 28: // Enter
|
||||||
|
act = 7; break;
|
||||||
|
case 82: // Insert
|
||||||
|
act = 8; break;
|
||||||
|
case 78: // NumPad+ select all
|
||||||
|
act = 9; break;
|
||||||
|
case 74: // NumPad- deselct
|
||||||
|
act = 10; break;
|
||||||
|
case 55: // NumPad* invert selection
|
||||||
|
act = 11; break;
|
||||||
|
default:
|
||||||
|
act = 12; // search by letter
|
||||||
|
}
|
||||||
|
fb->key_action = act;
|
||||||
|
fb->key_action_num = keypress.ctrl_key;
|
||||||
|
|
||||||
|
// debug_board_printf("key pressed [%X] %d, action %d, ext_flag = %d\n", keypress.val, brows.key_action_num, act, extended_key);
|
||||||
|
|
||||||
|
if (extended_key) extended_key = 0;
|
||||||
|
(*filebrowse_key)(fb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* KOLIBRI_FILEBROWSE_H */
|
#endif /* KOLIBRI_FILEBROWSE_H */
|
||||||
|
@ -66,7 +66,7 @@ void kolibri_handle_event_redraw(kolibri_window* some_window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void kolibri_handle_event_key(kolibri_window* some_window)
|
void kolibri_handle_event_key(kolibri_window* some_window, oskey_t key)
|
||||||
{
|
{
|
||||||
/* Enumerate and trigger key handling functions of window elements here */
|
/* Enumerate and trigger key handling functions of window elements here */
|
||||||
if(some_window->elements)
|
if(some_window->elements)
|
||||||
@ -75,9 +75,9 @@ void kolibri_handle_event_key(kolibri_window* some_window)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/* Only execute if the function pointer isn't NULL */
|
/* Only execute if the function pointer isn't NULL, or -1 (fail to find in export table) */
|
||||||
if((int)kolibri_gui_op_table[current_element -> type].key_fn > 0)
|
if((int)kolibri_gui_op_table[current_element -> type].key_fn > 0)
|
||||||
kolibri_gui_op_table[current_element -> type].key_fn(current_element -> element);
|
kolibri_gui_op_table[current_element -> type].key_fn(current_element -> element, key);
|
||||||
|
|
||||||
current_element = current_element -> next;
|
current_element = current_element -> next;
|
||||||
} while(current_element != some_window->elements); /* Have we covered all elements? */
|
} while(current_element != some_window->elements); /* Have we covered all elements? */
|
||||||
|
@ -44,12 +44,13 @@ typedef struct{
|
|||||||
}kolibri_window_element;
|
}kolibri_window_element;
|
||||||
|
|
||||||
typedef void (*cb_elem_boxlib)(void *) __attribute__((__stdcall__));
|
typedef void (*cb_elem_boxlib)(void *) __attribute__((__stdcall__));
|
||||||
|
typedef void (*cbkey_elem_boxlib)(void *, oskey_t) __attribute__((__stdcall__));
|
||||||
|
|
||||||
/* Generic structure for supporting functions on various elements of Kolibri's GUI */
|
/* Generic structure for supporting functions on various elements of Kolibri's GUI */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
cb_elem_boxlib redraw_fn;
|
cb_elem_boxlib redraw_fn;
|
||||||
cb_elem_boxlib mouse_fn;
|
cb_elem_boxlib mouse_fn;
|
||||||
cb_elem_boxlib key_fn;
|
cbkey_elem_boxlib key_fn;
|
||||||
}kolibri_element_operations;
|
}kolibri_element_operations;
|
||||||
|
|
||||||
/* Structure for a GUI Window on Kolibri. It also contains all the elements drawn in window */
|
/* Structure for a GUI Window on Kolibri. It also contains all the elements drawn in window */
|
||||||
@ -95,7 +96,7 @@ void kolibri_init_gui_op_table(void)
|
|||||||
/* Setting up functions for edit box GUI elements*/
|
/* Setting up functions for edit box GUI elements*/
|
||||||
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].redraw_fn = (cb_elem_boxlib)edit_box_draw;
|
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].redraw_fn = (cb_elem_boxlib)edit_box_draw;
|
||||||
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].mouse_fn = (cb_elem_boxlib)edit_box_mouse;
|
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].mouse_fn = (cb_elem_boxlib)edit_box_mouse;
|
||||||
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].key_fn = (cb_elem_boxlib)editbox_key;
|
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].key_fn = (cbkey_elem_boxlib)editbox_key;
|
||||||
|
|
||||||
/* Setting up functions for check box GUI elements*/
|
/* Setting up functions for check box GUI elements*/
|
||||||
kolibri_gui_op_table[KOLIBRI_CHECK_BOX].redraw_fn = (cb_elem_boxlib)check_box_draw2;
|
kolibri_gui_op_table[KOLIBRI_CHECK_BOX].redraw_fn = (cb_elem_boxlib)check_box_draw2;
|
||||||
@ -152,17 +153,16 @@ kolibri_gui_op_table[KOLIBRI_PATHSHOW].key_fn = NULL;
|
|||||||
|
|
||||||
kolibri_gui_op_table[KOLIBRI_FILEBROWSE].redraw_fn = (cb_elem_boxlib)filebrowse_draw;
|
kolibri_gui_op_table[KOLIBRI_FILEBROWSE].redraw_fn = (cb_elem_boxlib)filebrowse_draw;
|
||||||
kolibri_gui_op_table[KOLIBRI_FILEBROWSE].mouse_fn = (cb_elem_boxlib)filebrowse_mouse;
|
kolibri_gui_op_table[KOLIBRI_FILEBROWSE].mouse_fn = (cb_elem_boxlib)filebrowse_mouse;
|
||||||
kolibri_gui_op_table[KOLIBRI_FILEBROWSE].key_fn = (cb_elem_boxlib)filebrowse_key;
|
kolibri_gui_op_table[KOLIBRI_FILEBROWSE].key_fn = (cbkey_elem_boxlib)filebrowser_key;
|
||||||
|
|
||||||
kolibri_gui_op_table[KOLIBRI_EDITOR].redraw_fn = (cb_elem_boxlib)ted_draw;
|
kolibri_gui_op_table[KOLIBRI_EDITOR].redraw_fn = (cb_elem_boxlib)ted_draw;
|
||||||
kolibri_gui_op_table[KOLIBRI_EDITOR].mouse_fn = (cb_elem_boxlib)ted_mouse;
|
kolibri_gui_op_table[KOLIBRI_EDITOR].mouse_fn = (cb_elem_boxlib)ted_mouse;
|
||||||
kolibri_gui_op_table[KOLIBRI_EDITOR].key_fn = (cb_elem_boxlib)editor_key;
|
kolibri_gui_op_table[KOLIBRI_EDITOR].key_fn = (cbkey_elem_boxlib)editor_key;
|
||||||
debug_board_printf("KOLIBRI_EDITOR (%x,%x,%x)\n", ted_draw, ted_mouse, editor_key);
|
|
||||||
|
|
||||||
kolibri_gui_op_table[KOLIBRI_TREELIST].redraw_fn = (cb_elem_boxlib)tl_draw;
|
kolibri_gui_op_table[KOLIBRI_TREELIST].redraw_fn = (cb_elem_boxlib)treelist_draw;
|
||||||
kolibri_gui_op_table[KOLIBRI_TREELIST].mouse_fn = (cb_elem_boxlib)tl_mouse;
|
kolibri_gui_op_table[KOLIBRI_TREELIST].mouse_fn = (cb_elem_boxlib)tl_mouse;
|
||||||
kolibri_gui_op_table[KOLIBRI_TREELIST].key_fn = (cb_elem_boxlib)treelist_key;
|
kolibri_gui_op_table[KOLIBRI_TREELIST].key_fn = (cbkey_elem_boxlib)treelist_key;
|
||||||
debug_board_printf("KOLIBRI_TREELIST (%x,%x,%x)\n", tl_draw, tl_mouse, treelist_key);
|
debug_board_printf("KOLIBRI_TREELIST (%x,%x,%x)\n", treelist_draw, tl_mouse, treelist_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a new main GUI window for KolibriOS */
|
/* Create a new main GUI window for KolibriOS */
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
typedef struct __attribute__ ((__packed__)) {
|
typedef struct __attribute__ ((__packed__)) {
|
||||||
uint8_t retval; // 0 - win closed, 1 to n - button num, also default button on start
|
uint8_t retval; // 0 - win closed, 1 to n - button num, also default button on start
|
||||||
uint8_t reserv;
|
uint8_t reserv;
|
||||||
char texts[2048]; // mus be enough ;-)
|
char texts[2048]; // must be enough ;-)
|
||||||
char msgbox_stack[1024];
|
char msgbox_stack[1024];
|
||||||
uint32_t top_stack;
|
uint32_t top_stack;
|
||||||
} msgbox;
|
} msgbox;
|
||||||
@ -49,7 +49,7 @@ static inline msgbox* kolibri_new_msgbox(char* title, char* text, int def_but, .
|
|||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kolibri_start_msgbox(msgbox* box, msgbox_callback cb[])
|
static inline void kolibri_start_msgbox(msgbox* box, msgbox_callback cb[])
|
||||||
{
|
{
|
||||||
if (!msgbox_inited)
|
if (!msgbox_inited)
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,7 @@ typedef struct __attribute__ ((__packed__)) {
|
|||||||
uint32_t run_size;
|
uint32_t run_size;
|
||||||
uint32_t position2;
|
uint32_t position2;
|
||||||
uint32_t work_size;
|
uint32_t work_size;
|
||||||
uint32_t all_redraw;
|
uint32_t all_redraw; // need to be set =1 before each redraw
|
||||||
uint32_t ar_offset;
|
uint32_t ar_offset;
|
||||||
} scrollbar;
|
} scrollbar;
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ static inline treelist* kolibri_new_treelist( uint32_t x_w, uint32_t y_h, uint16
|
|||||||
tl->info_capt_len = info_capt_len;
|
tl->info_capt_len = info_capt_len;
|
||||||
tl->info_capt_offs = info_capt_offs;
|
tl->info_capt_offs = info_capt_offs;
|
||||||
tl->el_focus = el_focus;
|
tl->el_focus = el_focus;
|
||||||
tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(70, 30), 100, 30, 0);
|
tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0);
|
||||||
return tl;
|
return tl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,6 +89,12 @@ extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__));
|
|||||||
|
|
||||||
///âûâîä ñïèñêà íà ýêðàí
|
///âûâîä ñïèñêà íà ýêðàí
|
||||||
extern void (*tl_draw)(treelist *) __attribute__((__stdcall__));
|
extern void (*tl_draw)(treelist *) __attribute__((__stdcall__));
|
||||||
|
__attribute__((__stdcall__)) static inline void treelist_draw(treelist *tl)
|
||||||
|
{
|
||||||
|
tl->p_scroll->all_redraw = 1;
|
||||||
|
(*tl_draw)(tl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///ïåðåìåùàåì óçåë ââåðõ
|
///ïåðåìåùàåì óçåë ââåðõ
|
||||||
extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__));
|
extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__));
|
||||||
@ -120,6 +126,7 @@ static inline void treelist_data_clear(treelist *tl)
|
|||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"pop %%edi \n\t":::);
|
"pop %%edi \n\t":::);
|
||||||
|
free(tl->p_scroll);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__));
|
extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__));
|
||||||
@ -137,17 +144,13 @@ static inline void treelist_info_clear(treelist *tl)
|
|||||||
|
|
||||||
extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
|
extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
|
||||||
///ðåàêöèÿ íà êëàâèàòóðó
|
///ðåàêöèÿ íà êëàâèàòóðó
|
||||||
static inline void treelist_key(treelist *tl)
|
__attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"push %%ebx \n\t"
|
"push %2\n\t"
|
||||||
"push %%edi \n\t":::);
|
"call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):); // indirect call with asterisk *
|
||||||
|
|
||||||
(*tl_key_asm)(tl);
|
// (*tl_key_asm)(tl);
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"pop %%edi \n\t"
|
|
||||||
"pop %%ebx \n\t":::);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__));
|
extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__));
|
||||||
|
Loading…
Reference in New Issue
Block a user