Subversion Repositories Kolibri OS

Rev

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

  1. #define printf
  2. class TKlbrGraphDraw : public TBaseGraphDraw<TKlbrGraphDraw>
  3. {
  4.         unsigned long cur_color;
  5.         int quit;
  6.         typedef TBaseGraphDraw<TKlbrGraphDraw> TGraphDraw;
  7. public:
  8.         TKlbrGraphDraw(const char *s = 0) : TGraphDraw(s) {}
  9.         int GetStatus() {return 1;}
  10.         int Run(int evmask = 0, int w = INT_MIN, int h = INT_MIN);
  11.         int SetColor(unsigned long c) {cur_color=c;return 1;}
  12.         int DrawLine(int x0, int y0, int x1, int y1);
  13.         int DrawText(int x0, int y0, char* text);
  14.         int IsDraw(void) {return 1;}
  15.         int DrawClear();
  16.         unsigned long CreateColor(unsigned short red,
  17.                         unsigned short green, unsigned short blue);
  18.         void GetSize(int &w, int &h);
  19.         int GetTextH(const char *s) {return 10;}
  20.         int GetTextW(const char *s) {return 6 * strlen(s);}
  21.         void Quit(int q = 1) {quit = q;}
  22. };
  23. int TKlbrGraphDraw::DrawLine(int x0, int y0, int x1, int y1)
  24. {
  25.         __asm__ __volatile__("int $0x40" :: "a"(38), "b"((x0 << 16) + x1), "c"((y0 << 16) + y1), "d"(cur_color));
  26.         return 1;
  27. }
  28. int TKlbrGraphDraw::DrawText(int x0, int y0, char* text)
  29. {
  30.         __asm__ __volatile__("int $0x40" :: "a"(4), "b"((x0 << 16) + y0), "c"(cur_color | 0xC0000000), "d"(text), "D"(0xFFFFFF));
  31.         return 1;
  32. }
  33. int TKlbrGraphDraw::DrawClear(void)
  34. {
  35.         int w,h;
  36.         GetSize(w,h);
  37.         __asm__ __volatile__("int $0x40" :: "a"(13), "b"(w), "c"(h), "d"(0xFFFFFF));
  38.         return 1;
  39. }
  40. unsigned long TKlbrGraphDraw::CreateColor(unsigned short red,
  41.                           unsigned short green, unsigned short blue)
  42. {
  43.   return (unsigned long)(blue >> 8) + ((unsigned long)(green >> 8) << 8) +
  44.          ((unsigned long)(red >> 8) << 16);
  45. }
  46. void TKlbrGraphDraw::GetSize(int &w, int &h)
  47. {
  48.         char buffer[1024];
  49.         __asm__ __volatile__("int $0x40" :: "a"(9), "b"(buffer), "c"(-1));
  50.         w = *(int*)(buffer + 62);
  51.         h = *(int*)(buffer + 66);
  52. }
  53. #define XK_Left         0xB0
  54. #define XK_Right        0xB3
  55. #define XK_Up           0xB2
  56. #define XK_Down         0xB1
  57. #define XK_Return       0x0D
  58. #define XK_space        0x20
  59. #define XK_Escape       0x1B
  60. #define XK_less         '<'
  61. #define XK_comma        ','
  62. #define XK_period       '.'
  63. #define XK_greater      '>'
  64. #define XK_minus        '-'
  65. #define XK_equal        '='
  66. #define XK_underscore   '_'
  67. #define XK_plus         '+'
  68. #define XK_Delete       0xB6
  69. #define XK_F8           0x39
  70. #define XK_l            'l'
  71. #define XK_L            'L'
  72. #define XK_F2           0x33
  73. #define XK_s            's'
  74. #define XK_S            'S'
  75. #define XK_slash        '/'
  76. #define XK_question     '?'
  77. #define XK_n            'n'
  78. #define XK_N            'N'
  79. #define XK_t            't'
  80. #define XK_T            'T'
  81. #define XK_r            'r'
  82. #define XK_R            'R'
  83. #define XK_b            'b'
  84. #define XK_B            'B'
  85. #define XK_f            'f'
  86. #define XK_F            'F'
  87. int TKlbrGraphDraw::Run(int evmask, int w, int h)
  88. {
  89.         __asm__ __volatile__("int $0x40" :: "a"(40), "b"(0x27)); // enable mouse events
  90.         quit = 0;
  91.         char buffer[1024];
  92.         int event = 1;
  93.         int skinHeight;
  94.         int prev_mouse_btn = 0;
  95.         for (;;) {
  96.                 switch (event) {
  97.                 case 1:
  98.                         __asm__ __volatile__("int $0x40" :: "a"(12), "b"(1));
  99.                         __asm__ __volatile__("int $0x40" : "=a"(skinHeight) : "a"(48), "b"(4));
  100.                         __asm__ __volatile__("int $0x40" :: "a"(0), "b"(w+9), "c"(h+skinHeight+4), "d"(0x33FFFFFF), "S"(0), "D"(title));
  101.                         {
  102.                                 TGraphDraw::event ev;
  103.                                 ev.type = TGraphDraw::event::draw;
  104.                                 ev.any.drw = this;
  105.                                 evfunc(ev);
  106.                         }
  107.                         __asm__ __volatile__("int $0x40" :: "a"(12), "b"(2));
  108.                         break;
  109.                 case 2:
  110.                         {
  111.                                 int keyCode;
  112.                                 __asm__ __volatile__("int $0x40" : "=a"(keyCode) : "a"(2));
  113.                                 if (!(keyCode & 0xFF)) {
  114.                                         TGraphDraw::event ev;
  115.                                         ev.type = TGraphDraw::event::key_down;
  116.                                         ev.any.drw = this;
  117.                                         ev.key.k = (keyCode >> 8) & 0xFF;
  118.                                         evfunc(ev);
  119.                                 }
  120.                         }
  121.                         break;
  122.                 case 3:
  123.                         return 0;
  124.                 case 6:
  125.                         {
  126.                                 int mouse_btn;
  127.                                 int mouse_pos;
  128.                                 __asm__ __volatile__("int $0x40" : "=a"(mouse_btn) : "a"(37), "b"(2));
  129.                                 mouse_btn &= 1;
  130.                                 if (prev_mouse_btn == mouse_btn)
  131.                                         break;
  132.                                 prev_mouse_btn = mouse_btn;
  133.                                 __asm__ __volatile__("int $0x40" : "=a"(mouse_pos) : "a"(37), "b"(1));
  134.                                 TGraphDraw::event ev;
  135.                                 ev.type = mouse_btn ? TGraphDraw::event::button_down : TGraphDraw::event::button_up;
  136.                                 ev.any.drw = this;
  137.                                 ev.button.n = 1;
  138.                                 ev.button.x = mouse_pos >> 16;
  139.                                 ev.button.y = (short)mouse_pos;
  140.                                 evfunc(ev);
  141.                         }
  142.                         break;
  143.                 }
  144.                 if (quit)
  145.                         return quit;
  146.                 __asm__ __volatile__("int $0x40" : "=a"(event) : "a"(10));
  147.         }
  148. }
  149.