Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1176 andrew_pro 1
/*
2
	libGUI dinamic library SDK
3
	load library and link function
4
 */
5
 
6
#include "libGUI.h"
7
 
8
 
9
struct IMPORT
10
{
11
	char *name;
12
	void *function;
13
}__attribute__((packed));
14
 
15
typedef struct IMPORT import_t;
16
 
17
static char *sys_libGUI_path="/sys/lib/libGUI.obj";
18
 
19
static char* funcnames[] = {"LibGUIversion","InitLibGUI","LibGUImain","QuitLibGUI",
20
 
21
				"CreateWindow","SetWindowSizeRequest",
22
 
23
				"PackControls","DestroyControl","SetControlSizeRequest","GetControlSizeX",
24
				"GetControlSizeY","SetControlNewPosition","GetControlPositionX",
25
				"GetControlPositionY","SetFocuse","RedrawControl","SpecialRedrawControl",
26
 
27
				"SetCallbackFunction","BlockCallbackFunction","UnblockCallbackFunction",
28
 
29
				"SetIDL_Function","DestroyIDL_Function",
30
 
31
				"SetTimerCallbackForFunction","DestroyTimerCallbackForFunction",
32
 
33
				"SetCallbackFunctionForEvent","DestroyCallbackFunctionForEvent",
34
 
35
				"CreateButton","CreateButtonWithText",
36
 
37
				"CreateProgressBar","SetProgressBarPulse","ProgressBarSetText","ProgressBarGetText",
38
 
39
				"CreateHorizontalScrollBar","CreateVerticalScrollBar",
40
 
41
				"CreateScrolledWindow","ScrolledWindowPackControls",
42
 
43
				"CreateImage",
44
 
45
				"CreateText","TextBackgroundOn","TextBackgroundOff",
46
 
47
				"LoadFont","FreeFont"};
48
 
49
 
50
static inline void* gui_ksys_load_dll(char *path)
51
{
52
	void	*dll_export;
53
 
54
     __asm__ __volatile__(
55
	"int $0x40"
56
	:"=a"(dll_export)
57
	:"a"(68),"b"(19),"c"(path));
58
 
59
	return(dll_export);
60
}
61
 
62
static inline void gui_ksys_debug_out(int c)
63
{
64
     __asm__ __volatile__(
65
	"int $0x40"
66
	:
67
	:"a"(63),"b"(1),"c"(c));
68
}
69
 
70
static void gui_debug_out_str(char *s)
71
{
72
 
73
	while(*s)
74
	{
75
		if (*s=='\n') gui_ksys_debug_out(13);
76
 
77
		gui_ksys_debug_out(*s);
78
		s++;
79
	}
80
}
81
 
82
static int gui_strcmp(const char* string1, const char* string2)
83
{
84
	while (1)
85
	{
86
		if (*string1<*string2)
87
			return -1;
88
		if (*string1>*string2)
89
			return 1;
90
		if (*string1=='\0')
91
			return 0;
92
		string1++;
93
		string2++;
94
	}
95
}
96
 
97
static void* gui_cofflib_getproc(import_t *lib, char *name)
98
{
99
	int i;
100
 
101
	for(i = 0; lib[i].name && gui_strcmp(name, lib[i].name); i++);
102
 
103
	if(lib[i].name)	return lib[i].function;
104
			else	return NULL;
105
}
106
 
107
static inline void gui_ksys_exit(int value)
108
{
109
     __asm__ __volatile__(
110
	"int $0x40"
111
	:
112
	:"a"(-1),"b"(value));
113
}
114
 
115
void link_libGUI(import_t *exp,char **imports)
116
{
117
	LibGUIversion=(DWORD stdcall (*)(void))
118
			gui_cofflib_getproc(exp,imports[0]);
119
	InitLibGUI=(char stdcall (*)(void))
120
			gui_cofflib_getproc(exp,imports[1]);
121
	LibGUImain=(void stdcall (*)(parent_t *WindowParent))
122
			gui_cofflib_getproc(exp,imports[2]);
123
	QuitLibGUI=(void stdcall (*)(parent_t *window))
124
			gui_cofflib_getproc(exp,imports[3]);
125
	CreateWindow=(void* stdcall (*)(void))
126
			gui_cofflib_getproc(exp,imports[4]);
127
	SetWindowSizeRequest=(void stdcall (*)(parent_t *WindowParent,int size_x,int size_y))
128
			gui_cofflib_getproc(exp,imports[5]);
129
	PackControls=(void stdcall (*)(void *Parent,void *control))
130
			gui_cofflib_getproc(exp,imports[6]);
131
	DestroyControl=(void stdcall (*)(void *control))
132
			gui_cofflib_getproc(exp,imports[7]);
133
	SetControlSizeRequest=(void stdcall (*)(void *Control,int new_size_x,int new_size_y))
134
			gui_cofflib_getproc(exp,imports[8]);
135
	GetControlSizeX=(int stdcall (*)(void *Control))
136
			gui_cofflib_getproc(exp,imports[9]);
137
	GetControlSizeY=(int stdcall (*)(void *Control))
138
			gui_cofflib_getproc(exp,imports[10]);
139
	SetControlNewPosition=(void stdcall (*)(void *Control,int new_x,int new_y))
140
			gui_cofflib_getproc(exp,imports[11]);
141
	GetControlPositionX=(int stdcall (*)(void *Control))
142
			gui_cofflib_getproc(exp,imports[12]);
143
	GetControlPositionY=(int stdcall (*)(void *Control))
144
			gui_cofflib_getproc(exp,imports[13]);
145
	SetFocuse=(void* stdcall (*)(void *Control))
146
			gui_cofflib_getproc(exp,imports[14]);
147
	RedrawControl=(void stdcall (*)(void *Control))
148
			gui_cofflib_getproc(exp,imports[15]);
149
	SpecialRedrawControl=(void stdcall (*)(void *Control))
150
			gui_cofflib_getproc(exp,imports[16]);
151
	SetCallbackFunction=(gui_callback_t* stdcall (*)(void *Control,
152
					int event_name,void *callback_func,void *callback_func_data))
153
			gui_cofflib_getproc(exp,imports[17]);
154
	BlockCallbackFunction=(void stdcall (*)(void *Control,gui_callback_t *callback_ID))
155
			gui_cofflib_getproc(exp,imports[18]);
156
	UnblockCallbackFunction=(void stdcall (*)(void *Control,gui_callback_t *callback_ID))
157
			gui_cofflib_getproc(exp,imports[19]);
158
	SetIDL_Function=(void stdcall (*)(parent_t *Parent,void *function,void *function_data))
159
			gui_cofflib_getproc(exp,imports[20]);
160
	DestroyIDL_Function=(void stdcall (*)(parent_t *Parent))
161
			gui_cofflib_getproc(exp,imports[21]);
162
	SetTimerCallbackForFunction=(gui_timer_t* stdcall (*)(parent_t *parent_window,
163
					int time_tick,void *func,void *func_data))
164
			gui_cofflib_getproc(exp,imports[22]);
165
	DestroyTimerCallbackForFunction=(void stdcall (*)(gui_timer_t *timer))
166
			gui_cofflib_getproc(exp,imports[23]);
167
	SetCallbackFunctionForEvent=(gui_callbackevent_t* stdcall (*)(parent_t *parent_window,
168
					int event_type,void *func,void *func_data))
169
			gui_cofflib_getproc(exp,imports[24]);
170
	DestroyCallbackFunctionForEvent=(void stdcall (*)(gui_callbackevent_t *callback_event))
171
			gui_cofflib_getproc(exp,imports[25]);
172
	CreateButton=(gui_button_t* stdcall (*)(gui_button_data_t *info_for_control))
173
			gui_cofflib_getproc(exp,imports[26]);
174
	CreateButtonWithText=(gui_button_t* stdcall (*)(gui_button_data_t *info,char *txt))
175
			gui_cofflib_getproc(exp,imports[27]);
176
	CreateProgressBar=(gui_progress_bar_t* stdcall (*)(gui_progress_bar_data_t *info_for_control))
177
			gui_cofflib_getproc(exp,imports[28]);
178
	SetProgressBarPulse=(void stdcall (*)(gui_progress_bar_t *ProgressBar,int time_update))
179
			gui_cofflib_getproc(exp,imports[29]);
180
	ProgressBarSetText=(void stdcall (*)(gui_progress_bar_t *pbar,char *txt))
181
			gui_cofflib_getproc(exp,imports[30]);
182
	ProgressBarGetText=(char* stdcall (*)(gui_progress_bar_t *pbar))
183
			gui_cofflib_getproc(exp,imports[31]);
184
	CreateHorizontalScrollBar=(gui_scroll_bar_t* stdcall (*)(gui_scroll_bar_data_t *info_for_control))
185
			gui_cofflib_getproc(exp,imports[32]);
186
	CreateVerticalScrollBar=(gui_scroll_bar_t* stdcall (*)(gui_scroll_bar_data_t *info_for_control))
187
			gui_cofflib_getproc(exp,imports[33]);
188
	CreateScrolledWindow=(gui_scrolled_window_t* stdcall (*)(gui_scrolled_window_data_t *info_for_control))
189
			gui_cofflib_getproc(exp,imports[34]);
190
	ScrolledWindowPackControls=(void stdcall (*)(gui_scrolled_window_t *parent,void *Control))
191
			gui_cofflib_getproc(exp,imports[35]);
192
	CreateImage=(gui_image_t* stdcall (*)(gui_image_data_t *info_for_control))
193
			gui_cofflib_getproc(exp,imports[36]);
194
	CreateText=(gui_text_t* stdcall (*)(gui_text_data_t *info_for_control))
195
			gui_cofflib_getproc(exp,imports[37]);
196
	TextBackgroundOn=(void stdcall (*)(gui_text_t *Text))
197
			gui_cofflib_getproc(exp,imports[38]);
198
	TextBackgroundOff=(void stdcall (*)(gui_text_t *Text))
199
			gui_cofflib_getproc(exp,imports[39]);
200
	LoadFont=(font_t* stdcall (*)(char *fullfontname))
201
			gui_cofflib_getproc(exp,imports[40]);
202
	FreeFont=(void stdcall (*)(font_t *font))
203
			gui_cofflib_getproc(exp,imports[41]);
204
}
205
 
206
void	LoadLibGUI(char *lib_path)
207
{
208
	import_t	*export;
209
	char		*path;
210
 
211
	if (lib_path==NULL)
212
	{
213
		path=sys_libGUI_path;
214
		export=(import_t*)gui_ksys_load_dll(path);
215
	}
216
	else
217
	{
218
		path=lib_path;
219
		export=(import_t*)gui_ksys_load_dll(path);
220
	}
221
 
222
	if (export==NULL)
223
	{
224
		gui_debug_out_str("\ncan't load lib=");
225
		gui_debug_out_str(path);
226
		gui_ksys_exit(0);
227
	}
228
	else
229
	{
230
		link_libGUI(export,funcnames);
231
		if (InitLibGUI())
232
		{
233
			gui_debug_out_str("\ncan't initialize libGUI");
234
			gui_ksys_exit(0);
235
		}
236
	}
237
}
238
 
239