Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5125 clevermous 1
#define printf
2
class TKlbrGraphDraw : public TBaseGraphDraw
3
{
4
	unsigned long cur_color;
5
	int quit;
6
	typedef TBaseGraphDraw 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
}