Subversion Repositories Kolibri OS

Rev

Rev 6612 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #ifndef KOLIBRI_EDITBOX_H
  2. #define KOLIBRI_EDITBOX_H
  3.  
  4. #include "kolibri_colors.h"
  5.  
  6. /*  flags meaning
  7. ed_figure_only= 1000000000000000b   ;îäíè ñèìâîëû
  8. ed_always_focus= 100000000000000b   // âñåãäà ñ êóðñîðîì (ôîêóñîì)
  9. ed_focus=                     10b   ;ôîêóñ ââîäà ïðèëîæåíèÿ, ìûøèòñÿ ñàìîñòîÿòåëüíî
  10. ed_pass=                       1b   ;ïîëå ñ ïàðîëåì
  11. ed_shift_on=                1000b   ;åñëè íå óñòàíîâëåí -çíà÷èò âïåðâûå íàæàò shift,åñëè áûë óñòàíîâëåí, çíà÷èò ìû óæå ÷òî - òî äåëàëè óäåðæèâàÿ shift
  12. ed_shift_on_off=1111111111110111b
  13. ed_shift=                    100b   ;âêëþ÷àåòñÿ ïðè íàæàòèè íà shift ò.å. åñëè íàæèìàþ
  14. ed_shift_off=   1111111111111011b
  15. ed_shift_bac=              10000b   ;áèò äëÿ î÷èñòêè âûäåëåíîãî shift ò.å. ïðè óñòàíîâêå ãîâîðèò ÷òî åñòü âûäåëåíèå
  16. ed_shift_bac_cl=1111111111101111b   ;î÷èñòêà ïðè óäàëåíèè âûäåëåíèÿ
  17. ed_shift_cl=    1111111111100011b
  18. ed_shift_mcl=   1111111111111011b
  19. ed_left_fl=               100000b
  20. ed_right_fl=    1111111111011111b
  21. ed_offset_fl=            1000000b
  22. ed_offset_cl=   1111111110111111b
  23. ed_insert=              10000000b
  24. ed_insert_cl=   1111111101111111b
  25. ed_mouse_on =          100000000b
  26. ed_mous_adn_b=         100011000b
  27. ed_mouse_on_off=1111111011111111b
  28. ed_mouse_on_off= not (ed_mouse_on)
  29. ed_ctrl_on =          1000000000b
  30. ed_ctrl_off = not (ed_ctrl_on)
  31. ed_alt_on =          10000000000b
  32. ed_alt_off = not (ed_alt_on)
  33. ed_disabled=        100000000000b
  34. */
  35.  
  36. typedef struct edit_box_t {
  37.   unsigned int width;
  38.     unsigned int left;
  39.     unsigned int top;
  40.     unsigned int color;
  41.     unsigned int shift_color;   // selected text color
  42.     unsigned int focus_border_color;
  43.     unsigned int blur_border_color;
  44.     unsigned int text_color;
  45.     unsigned int max;
  46.     char        *text;
  47.     void        *mouse_variable; // must be pointer edit_box** to save focused editbox
  48.     unsigned int flags;
  49.  
  50.     unsigned int size;  // used symbols in buffer without trailing zero
  51.     unsigned int pos;  // cursor position
  52. /* The following struct members are not used by the users of API */
  53.     unsigned int offset;
  54.     unsigned int cl_curs_x;
  55.     unsigned int cl_curs_y;
  56.     unsigned int shift;
  57.     unsigned int shift_old;
  58.     unsigned int height;
  59.     unsigned int char_width;
  60. }edit_box;
  61.  
  62. /* Initializes an Editbox with sane settings, sufficient for most use.
  63.    This will let you create a box and position it somewhere on the screen.
  64.    The text_buffer is a pointer to a character array and needs to be as long as
  65.    AT LEAST MAX_CHARS + 1.If the text_buffer is smaller, it will crash if user
  66.    types more characters than what will fit into the text buffer.
  67.  
  68.    Allocating buffer space automatically so that programmer can be carefree now.
  69.    This also automatically adjusts the size of edit box so that it can hold enough characters.
  70.  
  71.    All you need is :
  72.  
  73.    tlx,tly = Coordinates of the beginning of the edit box.
  74.    max_chars = Limit of number of characters user can enter into edit box.
  75. */
  76.  
  77. edit_box* kolibri_new_edit_box(unsigned int tlx, unsigned int tly, unsigned int max_chars, void *editbox_interlock)
  78. {
  79.     unsigned int PIXELS_PER_CHAR = 7;
  80.     edit_box *new_textbox = (edit_box *)calloc(1, sizeof(edit_box));
  81.     char *text_buffer = (char *)calloc(max_chars + 2, sizeof(char)); // +2 as asked in box_lib src
  82.  
  83.     /* Update blur_border_color and shift_color from box_lib.mac macro */
  84.     /* edit_boxes_set_sys_color */
  85.  
  86.     new_textbox -> width = max_chars * PIXELS_PER_CHAR;
  87.     new_textbox -> left = tlx;
  88.     new_textbox -> top = tly;
  89.     new_textbox -> color = 0xFFFFFF; /* Always make white edit boxes */
  90.     new_textbox -> shift_color = 0x6a9480;
  91.     new_textbox -> focus_border_color = kolibri_color_table.color_work_graph;
  92.     new_textbox -> blur_border_color = 0x6a9480;
  93.     new_textbox -> text_color = kolibri_color_table.color_work_text; /* Always black text when typing */
  94.     new_textbox -> max = max_chars;
  95.     new_textbox -> text = text_buffer;
  96.     new_textbox -> mouse_variable = editbox_interlock;
  97.     new_textbox -> flags = 0x00000000;
  98.  
  99.     return new_textbox;
  100. }
  101.  
  102. extern void (*edit_box_draw)(edit_box *) __attribute__((__stdcall__));
  103.  
  104. extern void (*edit_box_key)(edit_box *) __attribute__((__stdcall__));
  105. /* editbox_key is a wrapper written in assembly to handle key press events for editboxes */
  106. /* because inline assembly in GCC is a PITA and interferes with the EAX (AH) register */
  107. /* which edit_box_key requires */
  108. __attribute__((__stdcall__)) void editbox_key(edit_box *e, oskey_t ch)
  109. /// åñëè flags íå ñîäåðæèò ed_focus, èãíîðèðóåò ââîä
  110. /// åñëè flags ñîäåðæèò ed_mouse_on èëè ed_disabled, èãíîðèðóåò ââîä
  111. /// íà ââîäå îæèäàåò ch - êîä êëàâèøè, òîëüêî â ðåæèìå ASCII
  112. {
  113.     __asm__ __volatile__ (
  114.              "push %2\n\t"
  115.              "call *%1 \n\t"::"a"(ch.val), "m"(edit_box_key), "m"(e):);
  116. }
  117.  
  118. extern void (*edit_box_mouse)(edit_box *) __attribute__((__stdcall__));
  119. /// ïðè ùåë÷êå íå ëåâîé êíîïêîé, îáíóëÿåò *mouse_variable! è ñáðàñûâàåò ôëàã ed_mouse_on
  120.  
  121.  
  122. extern void (*edit_box_set_text)(edit_box *, char *) __attribute__((__stdcall__));
  123. extern volatile unsigned press_key;
  124. #endif /* KOLIBRI_EDITBOX_H */
  125.