Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "tp.h"
  2. #include <menuet/thread.h>
  3.  
  4. typedef unsigned short int uint16_t;
  5. typedef unsigned int uint32_t;
  6.  
  7. extern void _tp_raise(TP,tp_obj);
  8. extern tp_obj tp_dict(TP);
  9. extern tp_obj tp_method(TP,tp_obj self,tp_obj v(TP));
  10. extern tp_obj tp_number(tp_num v);
  11. extern tp_obj tp_list(TP);
  12. extern void _tp_list_append(TP,_tp_list *self, tp_obj v);
  13. extern tp_obj tp_call(TP, const char *mod, const char *fnc, tp_obj params);
  14. extern void _tp_call(TP,tp_obj *dest, tp_obj fnc, tp_obj params);
  15. extern int tp_bool(TP,tp_obj v);
  16. extern tp_obj tp_has(TP,tp_obj self, tp_obj k);
  17. #define _cdecl __attribute__((cdecl))
  18. extern int (* _cdecl con_printf)(const char* format,...);
  19. static tp_obj kolibri_show(TP)
  20. {
  21.     tp_obj self = TP_TYPE(TP_DICT);
  22.     uint16_t xpos = (uint16_t)(tp_get(tp, self, tp_string("x")).number.val);
  23.     uint16_t ypos = (uint16_t)tp_get(tp, self, tp_string("y")).number.val;
  24.     uint16_t height = (uint16_t)tp_get(tp, self, tp_string("height")).number.val;
  25.     uint16_t width = (uint16_t)tp_get(tp, self, tp_string("width")).number.val;
  26.     uint16_t fixedsize = (uint16_t)tp_get(tp, self, tp_string("fixedsize")).number.val;
  27.     uint32_t bgcolor = (uint32_t)tp_get(tp, self, tp_string("bgcolor")).number.val;
  28.     uint32_t status;
  29.     uint32_t style;
  30.     uint32_t x = xpos * 0x10000 + width;
  31.     uint32_t y = ypos * 0x10000 + height;
  32.     if (fixedsize)
  33.         style = 0;
  34.     else
  35.         style = 0x33000000 + (bgcolor & 0xFFFFFF);
  36.     asm volatile ("int $0x40"::"a"(12), "b"(1));
  37.     asm volatile ("int $0x40"::
  38.                   "a"(0), "b"(x), "c"(y), "d"(style),
  39.                   "S"(0), "D"(0));
  40.     asm volatile ("int $0x40"::"a"(12), "b"(2));
  41.     /* If window has additional handler, run it. */
  42.     if (tp_bool(tp, tp_has(tp, self, tp_string("on_show"))))
  43.     {
  44.         tp_obj result;
  45.         tp_obj fnc = tp_get(tp, self, tp_string("on_show"));
  46.         tp_obj param_list = tp_list(tp); /* Prepare parameters. */
  47.         _tp_list_append(tp, param_list.list.val, self);
  48.         _tp_call(tp, &result, fnc, param_list);
  49.     }
  50.     return tp_None;
  51. }
  52.  
  53. static void window_function(void)
  54. {
  55.     uint32_t ev;
  56.     /* Wait for event. */
  57.     do {
  58.         asm volatile("int $0x40":"=a"(ev):"a"(10));
  59.     } while(ev != 3);
  60.     asm volatile("int $040"::"a"(-1));
  61. }
  62.  
  63. static tp_obj kolibri_default_handler(TP)
  64. {
  65.     return tp_None;
  66. }
  67.  
  68. /* Run window_function() in separated thread. */
  69. static tp_obj kolibri_run(TP)
  70. {
  71.     tp_obj self = TP_TYPE(TP_DICT);
  72.     tp_obj redraw = tp_get(tp, self, tp_string("show"));
  73.     tp_obj result;
  74.     tp_obj key_handler = tp_None;
  75.     tp_obj button_handler = tp_None;
  76.     int    button_id;
  77.     uint32_t ev;
  78.     int    leave=0;
  79.     tp_obj param_list;
  80.     /* Obtain handlers. */
  81.     if (tp_bool(tp, tp_has(tp, self, tp_string("on_key"))))
  82.         key_handler = tp_get(tp, self, tp_string("on_key"));
  83.     if (tp_bool(tp, tp_has(tp, self, tp_string("on_button"))))
  84.         button_handler = tp_get(tp, self, tp_string("on_button"));
  85.  
  86.     while(!leave){
  87.         asm volatile("int $0x40":"=a"(ev):"a"(10));
  88.         switch (ev)
  89.         {
  90.             case 1:
  91.                 _tp_call(tp, &result, redraw, tp_None);
  92.                 break;
  93.             case 2:
  94.                 if (key_handler.type == TP_FNC)
  95.                 {
  96.                     param_list = tp_list(tp); /* Prepare parameters. */
  97.                     _tp_list_append(tp, param_list.list.val, self);
  98.                     _tp_list_append(tp, param_list.list.val, tp_number(__menuet__getkey()));
  99.                     _tp_call(tp, &result, key_handler, param_list);
  100.                 }
  101.                 break;
  102.             case 3:
  103.                 button_id = __menuet__get_button_id();
  104.                 if (button_id == 1)
  105.                     leave = 1;
  106.                 else if (button_handler.type == TP_FNC)
  107.                 {
  108.                     param_list = tp_list(tp); /* Prepare parameters. */
  109.                     _tp_list_append(tp, param_list.list.val, self);
  110.                     _tp_list_append(tp, param_list.list.val, tp_number(button_id));
  111.                     _tp_call(tp, &result, button_handler, param_list);
  112.                 }
  113.                 break;
  114.             default:
  115.                 con_printf("Got unknown event %d\n", ev);
  116.                 break;
  117.         }
  118.     };
  119.     return tp_None;
  120. }
  121.  
  122. static tp_obj kolibri_print_text(TP)
  123. {
  124.     tp_obj self = TP_TYPE(TP_DICT);
  125.     uint32_t textcolor = (uint32_t)tp_get(tp, self, tp_string("textcolor")).number.val;
  126.     uint16_t x = (uint16_t)tp_get(tp, self, tp_string("curx")).number.val;
  127.     uint16_t y = (uint16_t)tp_get(tp, self, tp_string("cury")).number.val;
  128.     uint32_t ofs;
  129.     uint32_t width = (uint32_t)tp_get(tp, self, tp_string("width")).number.val;
  130.     tp_obj text = TP_TYPE(TP_STRING);
  131.  
  132.     __menuet__write_text(x, y, textcolor, (char *)text.string.val, text.string.len);
  133.     /* Update cursor position. */
  134.     ofs = 6 * text.string.len;
  135.     tp_set(tp, self, tp_string("cury"), tp_number(y + 9 * ((x + ofs) / width)));
  136.     tp_set(tp, self, tp_string("curx"), tp_number((x + ofs)%width));
  137.  
  138.     return tp_None;
  139. }
  140.  
  141. tp_obj kolibri_mainwindow(TP)
  142. {
  143.     tp_obj obj = tp_dict(tp);
  144.     obj = tp_dict(tp);
  145.     tp_set(tp, obj, tp_string("x"), TP_TYPE(TP_NUMBER));
  146.     tp_set(tp, obj, tp_string("y"), TP_TYPE(TP_NUMBER));
  147.     tp_set(tp, obj, tp_string("height"), TP_TYPE(TP_NUMBER));
  148.     tp_set(tp, obj, tp_string("width"), TP_TYPE(TP_NUMBER));
  149.     tp_set(tp, obj, tp_string("curx"), tp_number(0));
  150.     tp_set(tp, obj, tp_string("cury"), tp_number(0));
  151.     tp_set(tp, obj, tp_string("fixedsize"), TP_TYPE(TP_NUMBER));
  152.     tp_set(tp, obj, tp_string("textcolor"), tp_number(0x202020));
  153.     tp_set(tp, obj, tp_string("bgcolor"), tp_number(0xFFFFFF));
  154.     tp_set(tp, obj, tp_string("show"), tp_method(tp, obj, kolibri_show));
  155.     tp_set(tp, obj, tp_string("run"), tp_method(tp, obj, kolibri_run));
  156.     /*tp_set(tp, obj, tp_string("keyhandler"), tp_method(tp, obj, kolibri_default_handler));
  157.     tp_set(tp, obj, tp_string("buttonhandler"), tp_method(tp, obj, kolibri_default_handler));*/
  158.     tp_set(tp, obj, tp_string("print_text"), tp_method(tp, obj, kolibri_print_text));
  159.     return obj;
  160. }
  161.