From 12a29e00e5856b06f7f5cf19785b6e21c222dd48 Mon Sep 17 00:00:00 2001 From: siemargl Date: Thu, 20 Oct 2016 17:13:23 +0000 Subject: [PATCH] c-layer many fixes git-svn-id: svn://kolibrios.org@6612 a494cfbc-eb01-0410-851d-a64ba20cac60 --- contrib/C_Layer/ASM/loadboxlib.asm | 28 +++---- .../C_Layer/EXAMPLE/libguic_kolibri/Makefile | 3 +- .../EXAMPLE/libguic_kolibri/boardmsg.c | 8 +- .../EXAMPLE/libguic_kolibri/dbutton_files.c | 40 +--------- .../libguic_kolibri/editor_tree_msgbox.c | 76 ++++++++++++++++--- .../EXAMPLE/libguic_kolibri/option_menu.c | 2 +- .../EXAMPLE/libguic_kolibri/scroll_progress.c | 2 +- contrib/C_Layer/INCLUDE/kolibri_button.h | 3 +- contrib/C_Layer/INCLUDE/kolibri_debug.h | 13 +++- contrib/C_Layer/INCLUDE/kolibri_editbox.h | 26 +++++-- contrib/C_Layer/INCLUDE/kolibri_editor.h | 33 +++++--- contrib/C_Layer/INCLUDE/kolibri_filebrowse.h | 50 +++++++++++- contrib/C_Layer/INCLUDE/kolibri_gui.h | 6 +- .../C_Layer/INCLUDE/kolibri_gui_elements.h | 16 ++-- contrib/C_Layer/INCLUDE/kolibri_msgbox.h | 4 +- contrib/C_Layer/INCLUDE/kolibri_scrollbar.h | 2 +- contrib/C_Layer/INCLUDE/kolibri_treelist.h | 23 +++--- 17 files changed, 220 insertions(+), 115 deletions(-) diff --git a/contrib/C_Layer/ASM/loadboxlib.asm b/contrib/C_Layer/ASM/loadboxlib.asm index 5096e884af..6d16a32796 100644 --- a/contrib/C_Layer/ASM/loadboxlib.asm +++ b/contrib/C_Layer/ASM/loadboxlib.asm @@ -12,10 +12,8 @@ include '../../../programs/system/run/trunk/txtbut.inc' include '../../../programs/dll.inc' 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 pusha mcall 68,11 @@ -26,17 +24,21 @@ endp ;; Wrapper to handle edit_box_key function for editboxes. ;; Call this baby from C (refer kolibri_editbox.h for details) -editbox_key_thunk: - mov [oldebp], ebp ;Save ebp because GCC is crazy for it otherwise. - pop ebp ;Save return address in ebp. Stack top is param now. - mov eax, dword [press_key] - 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 +;public editbox_key_thunk as '_editbox_key@4' ; renamed due to ambiguity +;public press_key as '_press_key' +;; replaced by siemargl as inline ASM in C wrapper +;editbox_key_thunk: +; mov [oldebp], ebp ;Save ebp because GCC is crazy for it otherwise. +; pop ebp ;Save return address in ebp. Stack top is param now. +; mov eax, dword [press_key] +; 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: library lib_boxlib, 'box_lib.obj' diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/Makefile b/contrib/C_Layer/EXAMPLE/libguic_kolibri/Makefile index 5e5ad2aa0c..ee1b2e1f65 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/Makefile +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/Makefile @@ -35,7 +35,8 @@ option_menu: option_menu.o kos32-objcopy $@ -O binary 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 dbutton_files: dbutton_files.o diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/boardmsg.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/boardmsg.c index 688385afd9..99ada867fc 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/boardmsg.c +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/boardmsg.c @@ -48,7 +48,7 @@ int main() (*edit_box_set_text)(textbox2, "Sample text very long to get shorted"); - extern volatile unsigned press_key; + extern volatile unsigned press_key; do /* Start of main activity loop */ { @@ -58,7 +58,7 @@ int main() } else if(gui_event == KOLIBRI_EVENT_KEY) { - key = get_key(); + key = get_key(); switch (key.code) { case 13: @@ -69,9 +69,7 @@ int main() debug_board_write_str("\n"); break; } - press_key = key.val; - - kolibri_handle_event_key(main_window); + kolibri_handle_event_key(main_window, key); } else if(gui_event == KOLIBRI_EVENT_BUTTON) { diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c index 342b48d0f3..de0bd53675 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c @@ -109,7 +109,6 @@ int main(int argc, char **argv) brows.folder_data = read_folderdata("/rd/1"); brows.select_panel_counter = 1; // if want to show selection - int extended_key = 0, act = 0; do /* Start of main activity loop */ { switch(gui_event) @@ -124,44 +123,7 @@ int main(int argc, char **argv) break; case KOLIBRI_EVENT_KEY: keypress = get_key(); - if(keypress.state) break; - 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); + filebrowser_key(&brows, keypress); //kolibri_handle_event_key(main_window); break; case KOLIBRI_EVENT_BUTTON: diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/editor_tree_msgbox.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/editor_tree_msgbox.c index d092d49009..abe536b755 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/editor_tree_msgbox.c +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/editor_tree_msgbox.c @@ -28,6 +28,15 @@ char fname[4096]; char* load_file_inmem(char* fname, int32_t* read_sz); // 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) { /* 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 */ kolibri_gui_init(); + set_os_keyb_mode(1); // scan code mode needed for editor // kolibri_proclib_init(); // opensave && color dialogs kolibri_libimg_init(); // png handling @@ -43,7 +53,7 @@ int main(int argc, char **argv) uint32_t pressed_button = 0; // uint32_t mouse_button; // pos_t mouse_pos; - oskey_t keypress; +// oskey_t keypress; // make full path + argv 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"); 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)); - ed_lock = ed; - - 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); + 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; +/* + // 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 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); // читаем файл с курсорами и линиями @@ -75,8 +95,16 @@ int main(int argc, char **argv) treelist_node_add(tl, "node1", 1, 0, 0); // где 1 номер иконки с книгой 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_node_add(tl, "node3", 1, 0, 0); @@ -85,8 +113,28 @@ int main(int argc, char **argv) treelist_cursor_begin(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 + oskey_t key; do /* Start of main activity loop */ { switch(gui_event) @@ -99,10 +147,20 @@ int main(int argc, char **argv) case KOLIBRI_EVENT_NONE: break; case KOLIBRI_EVENT_KEY: + key = get_key(); +trap(0x55); // for stop in debug 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 - kolibri_handle_event_key(main_window); + kolibri_handle_event_key(main_window, key); break; case KOLIBRI_EVENT_BUTTON: pressed_button = get_os_button(); diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/option_menu.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/option_menu.c index 26724e8505..f8ceba8fcf 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/option_menu.c +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/option_menu.c @@ -134,7 +134,7 @@ int main() case KOLIBRI_EVENT_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()); - 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)) (*menu_bar_activate)(menu1); // wont work, immediately redraw command closes menu ( . but Alt+F1 worked in opendial.asm:463 diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c index b43c6ae6dc..dd5647e7f0 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c @@ -147,7 +147,7 @@ int main() } break; } - kolibri_handle_event_key(main_window); // ??????? + kolibri_handle_event_key(main_window, keypress); break; case KOLIBRI_EVENT_BUTTON: pressed_button = get_os_button(); diff --git a/contrib/C_Layer/INCLUDE/kolibri_button.h b/contrib/C_Layer/INCLUDE/kolibri_button.h index 74a4d6f08b..d1638f7225 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_button.h +++ b/contrib/C_Layer/INCLUDE/kolibri_button.h @@ -21,7 +21,8 @@ kolibri_button *kolibri_new_button(unsigned int tlx, unsigned int tly, unsigned 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); } diff --git a/contrib/C_Layer/INCLUDE/kolibri_debug.h b/contrib/C_Layer/INCLUDE/kolibri_debug.h index 1bee8c378b..7c11e5601f 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_debug.h +++ b/contrib/C_Layer/INCLUDE/kolibri_debug.h @@ -9,7 +9,7 @@ /* Write a printf() like function (variable argument list) for 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__( "int $0x40" : @@ -22,7 +22,7 @@ void __attribute__ ((noinline)) debug_board_write_str(const char* 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; char log_board[300]; @@ -32,5 +32,14 @@ void debug_board_printf(const char *format,...) va_end(ap); 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 */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_editbox.h b/contrib/C_Layer/INCLUDE/kolibri_editbox.h index 1f8edd25ce..f6497960bb 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_editbox.h +++ b/contrib/C_Layer/INCLUDE/kolibri_editbox.h @@ -5,8 +5,8 @@ /* flags meaning ed_figure_only= 1000000000000000b ;одни символы -ed_always_focus= 100000000000000b -ed_focus= 10b ;фокус ввода приложения +ed_always_focus= 100000000000000b // всегда с курсором (фокусом) +ed_focus= 10b ;фокус ввода приложения, мышится самостоятельно ed_pass= 1b ;поле с паролем ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift ed_shift_on_off=1111111111110111b @@ -43,8 +43,8 @@ typedef struct edit_box_t { unsigned int blur_border_color; unsigned int text_color; unsigned int max; - char *text; - struct edit_box_t** mouse_variable; // must be pointer edit_box** to save focused editbox + char *text; + void *mouse_variable; // must be pointer edit_box** to save focused editbox unsigned int flags; 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. */ -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; 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_key)(edit_box *) __attribute__((__stdcall__)); /* 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 */ /* 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__)); +/// при щелчке не левой кнопкой, обнуляет *mouse_variable! и сбрасывает флаг ed_mouse_on + -extern void (*edit_box_mouse)(edit_box *) __attribute__((__stdcall__)); extern void (*edit_box_set_text)(edit_box *, char *) __attribute__((__stdcall__)); extern volatile unsigned press_key; #endif /* KOLIBRI_EDITBOX_H */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_editor.h b/contrib/C_Layer/INCLUDE/kolibri_editor.h index 3a8c38e642..66d35e2dc9 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_editor.h +++ b/contrib/C_Layer/INCLUDE/kolibri_editor.h @@ -24,8 +24,8 @@ typedef struct __attribute__ ((__packed__)) { uint32_t y_pos; //50 uint32_t width; //440 uint32_t hight; //150 - uint32_t w_pane; //30 ширина панели в окне - uint32_t h_pane; //25 высота панели в окне + uint32_t w_pane; //30 ширина панели в окне, width of left pane with line numbers + uint32_t h_pane; //25 высота панели в окне, hight of top pane with Rows, Cols Undo info uint32_t width_sym; //9 ширина символа (знакоместа) в окне uint32_t hight_sym; //16 высота символа (знакоместа) в окне uint8_t drag_m; // выделение от мыши @@ -285,15 +285,21 @@ enum control_keys { }; 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, /// ch = GET_KEY /// 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__ ( "nop \n\t"::"a"(ch):); - (*ted_key_asm)(ed, table, control); +*/ } 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; }; - -static void editor_key(editor* ed) +__attribute__((__stdcall__)) +static void editor_key(editor* ed, oskey_t key) // callback for gui { + //if(ed->el_focus != ed) return; // need to check not to lose keyb buffer + uint32_t control = get_control_keys(); enum control_keys ed_ctrl = 0; int ly_opt = 1; @@ -425,7 +433,7 @@ static void editor_key(editor* ed) char conv_table[128]; 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) @@ -433,7 +441,7 @@ static inline void gui_add_editor(kolibri_window *wnd, 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) { @@ -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->hight = y_h & 0xFFFF; - // no panel, w_pane, h_pane == 0 + ed->w_pane = 30; + ed->h_pane = 20; // font if (font == 0) font = 0x10; // default 16 = 8x16 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->scr_w = kolibri_new_scrollbar_def(X_Y(50, 16), X_Y(50, 300), 100, 30, 0); - ed->scr_h = kolibri_new_scrollbar_def(X_Y(0, 150), X_Y(50, 16), 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, 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 = 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_invis = 1; // show nonprinted symbols + ed->el_focus = editor_interlock; + // ??? saveregs ax,cx,di editor_init(ed); // memory allocation, cleaning ed->syntax_file = (char*)&default_syntax; diff --git a/contrib/C_Layer/INCLUDE/kolibri_filebrowse.h b/contrib/C_Layer/INCLUDE/kolibri_filebrowse.h index fc77f3ee8a..a71896d918 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_filebrowse.h +++ b/contrib/C_Layer/INCLUDE/kolibri_filebrowse.h @@ -221,9 +221,57 @@ inline void gui_add_filebrowser(kolibri_window *wnd, filebrowser* f) { kolibri_window_add_element(wnd, KOLIBRI_FILEBROWSE, f); } - + extern void (*filebrowse_draw)(filebrowser *) __attribute__((__stdcall__)); extern void (*filebrowse_key)(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 */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_gui.h b/contrib/C_Layer/INCLUDE/kolibri_gui.h index 1ab83e234a..c35d57e753 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_gui.h +++ b/contrib/C_Layer/INCLUDE/kolibri_gui.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 */ if(some_window->elements) @@ -75,9 +75,9 @@ void kolibri_handle_event_key(kolibri_window* some_window) 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) - 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; } while(current_element != some_window->elements); /* Have we covered all elements? */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h b/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h index 65c11302d3..8822e07c1e 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h +++ b/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h @@ -44,12 +44,13 @@ typedef struct{ }kolibri_window_element; 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 */ typedef struct { cb_elem_boxlib redraw_fn; cb_elem_boxlib mouse_fn; - cb_elem_boxlib key_fn; + cbkey_elem_boxlib key_fn; }kolibri_element_operations; /* 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*/ 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].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*/ 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].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].mouse_fn = (cb_elem_boxlib)ted_mouse; -kolibri_gui_op_table[KOLIBRI_EDITOR].key_fn = (cb_elem_boxlib)editor_key; -debug_board_printf("KOLIBRI_EDITOR (%x,%x,%x)\n", ted_draw, ted_mouse, editor_key); +kolibri_gui_op_table[KOLIBRI_EDITOR].key_fn = (cbkey_elem_boxlib)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].key_fn = (cb_elem_boxlib)treelist_key; -debug_board_printf("KOLIBRI_TREELIST (%x,%x,%x)\n", tl_draw, tl_mouse, treelist_key); +kolibri_gui_op_table[KOLIBRI_TREELIST].key_fn = (cbkey_elem_boxlib)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 */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_msgbox.h b/contrib/C_Layer/INCLUDE/kolibri_msgbox.h index 7c6db9db48..2ae5686995 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_msgbox.h +++ b/contrib/C_Layer/INCLUDE/kolibri_msgbox.h @@ -5,7 +5,7 @@ typedef struct __attribute__ ((__packed__)) { uint8_t retval; // 0 - win closed, 1 to n - button num, also default button on start uint8_t reserv; - char texts[2048]; // mus be enough ;-) + char texts[2048]; // must be enough ;-) char msgbox_stack[1024]; uint32_t top_stack; } msgbox; @@ -49,7 +49,7 @@ static inline msgbox* kolibri_new_msgbox(char* title, char* text, int def_but, . 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) { diff --git a/contrib/C_Layer/INCLUDE/kolibri_scrollbar.h b/contrib/C_Layer/INCLUDE/kolibri_scrollbar.h index 201f59e488..fc59a56a7b 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_scrollbar.h +++ b/contrib/C_Layer/INCLUDE/kolibri_scrollbar.h @@ -29,7 +29,7 @@ typedef struct __attribute__ ((__packed__)) { uint32_t run_size; uint32_t position2; uint32_t work_size; - uint32_t all_redraw; + uint32_t all_redraw; // need to be set =1 before each redraw uint32_t ar_offset; } scrollbar; diff --git a/contrib/C_Layer/INCLUDE/kolibri_treelist.h b/contrib/C_Layer/INCLUDE/kolibri_treelist.h index 0aaebefe51..cd70e6a33d 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_treelist.h +++ b/contrib/C_Layer/INCLUDE/kolibri_treelist.h @@ -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_offs = info_capt_offs; 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; } @@ -88,7 +88,13 @@ static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl) 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__)); @@ -120,6 +126,7 @@ static inline void treelist_data_clear(treelist *tl) __asm__ __volatile__ ( "pop %%edi \n\t":::); + free(tl->p_scroll); } 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__)); ///реакция на клавиатуру -static inline void treelist_key(treelist *tl) +__attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code) { __asm__ __volatile__ ( - "push %%ebx \n\t" - "push %%edi \n\t":::); + "push %2\n\t" + "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):); // indirect call with asterisk * - (*tl_key_asm)(tl); - - __asm__ __volatile__ ( - "pop %%edi \n\t" - "pop %%ebx \n\t":::); +// (*tl_key_asm)(tl); } extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__));