forked from KolibriOS/kolibrios
244 lines
7.4 KiB
C
244 lines
7.4 KiB
C
|
/*
|
||
|
libGUI dinamic library SDK
|
||
|
load library and link function
|
||
|
*/
|
||
|
|
||
|
#include "libGUI.h"
|
||
|
|
||
|
|
||
|
struct IMPORT
|
||
|
{
|
||
|
char *name;
|
||
|
void *function;
|
||
|
}__attribute__((packed));
|
||
|
|
||
|
typedef struct IMPORT import_t;
|
||
|
|
||
|
static char *sys_libGUI_path="/sys/lib/libGUI.obj";
|
||
|
|
||
|
static char* funcnames[] = {"LibGUIversion","InitLibGUI","LibGUImain","QuitLibGUI",
|
||
|
|
||
|
"CreateWindow","SetWindowSizeRequest",
|
||
|
|
||
|
"PackControls","DestroyControl","SetControlSizeRequest","GetControlSizeX",
|
||
|
"GetControlSizeY","SetControlNewPosition","GetControlPositionX",
|
||
|
"GetControlPositionY","SetFocuse","RedrawControl","SpecialRedrawControl",
|
||
|
|
||
|
"SetCallbackFunction","BlockCallbackFunction","UnblockCallbackFunction",
|
||
|
|
||
|
"SetIDL_Function","DestroyIDL_Function",
|
||
|
|
||
|
"SetTimerCallbackForFunction","DestroyTimerCallbackForFunction",
|
||
|
|
||
|
"SetCallbackFunctionForEvent","DestroyCallbackFunctionForEvent",
|
||
|
|
||
|
"CreateButton","CreateButtonWithText",
|
||
|
|
||
|
"CreateProgressBar","SetProgressBarPulse","ProgressBarSetText","ProgressBarGetText",
|
||
|
|
||
|
"CreateHorizontalScrollBar","CreateVerticalScrollBar",
|
||
|
|
||
|
"CreateScrolledWindow","ScrolledWindowPackControls",
|
||
|
|
||
|
"CreateImage",
|
||
|
|
||
|
"CreateText","TextBackgroundOn","TextBackgroundOff",
|
||
|
|
||
|
"LoadFont","FreeFont"};
|
||
|
|
||
|
|
||
|
static inline void* gui_ksys_load_dll(char *path)
|
||
|
{
|
||
|
void *dll_export;
|
||
|
|
||
|
__asm__ __volatile__(
|
||
|
"int $0x40"
|
||
|
:"=a"(dll_export)
|
||
|
:"a"(68),"b"(19),"c"(path));
|
||
|
|
||
|
return(dll_export);
|
||
|
}
|
||
|
|
||
|
static inline void gui_ksys_debug_out(int c)
|
||
|
{
|
||
|
__asm__ __volatile__(
|
||
|
"int $0x40"
|
||
|
:
|
||
|
:"a"(63),"b"(1),"c"(c));
|
||
|
}
|
||
|
|
||
|
static void gui_debug_out_str(char *s)
|
||
|
{
|
||
|
|
||
|
while(*s)
|
||
|
{
|
||
|
if (*s=='\n') gui_ksys_debug_out(13);
|
||
|
|
||
|
gui_ksys_debug_out(*s);
|
||
|
s++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static int gui_strcmp(const char* string1, const char* string2)
|
||
|
{
|
||
|
while (1)
|
||
|
{
|
||
|
if (*string1<*string2)
|
||
|
return -1;
|
||
|
if (*string1>*string2)
|
||
|
return 1;
|
||
|
if (*string1=='\0')
|
||
|
return 0;
|
||
|
string1++;
|
||
|
string2++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void* gui_cofflib_getproc(import_t *lib, char *name)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for(i = 0; lib[i].name && gui_strcmp(name, lib[i].name); i++);
|
||
|
|
||
|
if(lib[i].name) return lib[i].function;
|
||
|
else return NULL;
|
||
|
}
|
||
|
|
||
|
static inline void gui_ksys_exit(int value)
|
||
|
{
|
||
|
__asm__ __volatile__(
|
||
|
"int $0x40"
|
||
|
:
|
||
|
:"a"(-1),"b"(value));
|
||
|
}
|
||
|
|
||
|
void link_libGUI(import_t *exp,char **imports)
|
||
|
{
|
||
|
LibGUIversion=(DWORD (stdcall *)(void))
|
||
|
gui_cofflib_getproc(exp,imports[0]);
|
||
|
InitLibGUI=(char (stdcall *)(void))
|
||
|
gui_cofflib_getproc(exp,imports[1]);
|
||
|
LibGUImain=(void (stdcall *)(parent_t *WindowParent))
|
||
|
gui_cofflib_getproc(exp,imports[2]);
|
||
|
QuitLibGUI=(void (stdcall *)(parent_t *window))
|
||
|
gui_cofflib_getproc(exp,imports[3]);
|
||
|
CreateWindow=(void* (stdcall *)(void))
|
||
|
gui_cofflib_getproc(exp,imports[4]);
|
||
|
SetWindowSizeRequest=(void (stdcall *)(parent_t *WindowParent,int size_x,int size_y))
|
||
|
gui_cofflib_getproc(exp,imports[5]);
|
||
|
PackControls=(void (stdcall *)(void *Parent,void *control))
|
||
|
gui_cofflib_getproc(exp,imports[6]);
|
||
|
DestroyControl=(void (stdcall *)(void *control))
|
||
|
gui_cofflib_getproc(exp,imports[7]);
|
||
|
SetControlSizeRequest=(void (stdcall *)(void *Control,int new_size_x,int new_size_y))
|
||
|
gui_cofflib_getproc(exp,imports[8]);
|
||
|
GetControlSizeX=(int (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[9]);
|
||
|
GetControlSizeY=(int (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[10]);
|
||
|
SetControlNewPosition=(void (stdcall *)(void *Control,int new_x,int new_y))
|
||
|
gui_cofflib_getproc(exp,imports[11]);
|
||
|
GetControlPositionX=(int (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[12]);
|
||
|
GetControlPositionY=(int (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[13]);
|
||
|
SetFocuse=(void* (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[14]);
|
||
|
RedrawControl=(void (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[15]);
|
||
|
SpecialRedrawControl=(void (stdcall *)(void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[16]);
|
||
|
SetCallbackFunction=(gui_callback_t* (stdcall *)(void *Control,
|
||
|
int event_name,void *callback_func,void *callback_func_data))
|
||
|
gui_cofflib_getproc(exp,imports[17]);
|
||
|
BlockCallbackFunction=(void (stdcall *)(void *Control,gui_callback_t *callback_ID))
|
||
|
gui_cofflib_getproc(exp,imports[18]);
|
||
|
UnblockCallbackFunction=(void (stdcall *)(void *Control,gui_callback_t *callback_ID))
|
||
|
gui_cofflib_getproc(exp,imports[19]);
|
||
|
SetIDL_Function=(void (stdcall *)(parent_t *Parent,void *function,void *function_data))
|
||
|
gui_cofflib_getproc(exp,imports[20]);
|
||
|
DestroyIDL_Function=(void (stdcall *)(parent_t *Parent))
|
||
|
gui_cofflib_getproc(exp,imports[21]);
|
||
|
SetTimerCallbackForFunction=(gui_timer_t* (stdcall *)(parent_t *parent_window,
|
||
|
int time_tick,void *func,void *func_data))
|
||
|
gui_cofflib_getproc(exp,imports[22]);
|
||
|
DestroyTimerCallbackForFunction=(void (stdcall *)(gui_timer_t *timer))
|
||
|
gui_cofflib_getproc(exp,imports[23]);
|
||
|
SetCallbackFunctionForEvent=(gui_callbackevent_t* (stdcall *)(parent_t *parent_window,
|
||
|
int event_type,void *func,void *func_data))
|
||
|
gui_cofflib_getproc(exp,imports[24]);
|
||
|
DestroyCallbackFunctionForEvent=(void (stdcall *)(gui_callbackevent_t *callback_event))
|
||
|
gui_cofflib_getproc(exp,imports[25]);
|
||
|
CreateButton=(gui_button_t* (stdcall *)(gui_button_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[26]);
|
||
|
CreateButtonWithText=(gui_button_t* (stdcall *)(gui_button_data_t *info,char *txt))
|
||
|
gui_cofflib_getproc(exp,imports[27]);
|
||
|
CreateProgressBar=(gui_progress_bar_t* (stdcall *)(gui_progress_bar_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[28]);
|
||
|
SetProgressBarPulse=(void (stdcall *)(gui_progress_bar_t *ProgressBar,int time_update))
|
||
|
gui_cofflib_getproc(exp,imports[29]);
|
||
|
ProgressBarSetText=(void (stdcall *)(gui_progress_bar_t *pbar,char *txt))
|
||
|
gui_cofflib_getproc(exp,imports[30]);
|
||
|
ProgressBarGetText=(char* (stdcall *)(gui_progress_bar_t *pbar))
|
||
|
gui_cofflib_getproc(exp,imports[31]);
|
||
|
CreateHorizontalScrollBar=(gui_scroll_bar_t* (stdcall *)(gui_scroll_bar_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[32]);
|
||
|
CreateVerticalScrollBar=(gui_scroll_bar_t* (stdcall *)(gui_scroll_bar_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[33]);
|
||
|
CreateScrolledWindow=(gui_scrolled_window_t* (stdcall *)(gui_scrolled_window_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[34]);
|
||
|
ScrolledWindowPackControls=(void (stdcall *)(gui_scrolled_window_t *parent,void *Control))
|
||
|
gui_cofflib_getproc(exp,imports[35]);
|
||
|
CreateImage=(gui_image_t* (stdcall *)(gui_image_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[36]);
|
||
|
CreateText=(gui_text_t* (stdcall *)(gui_text_data_t *info_for_control))
|
||
|
gui_cofflib_getproc(exp,imports[37]);
|
||
|
TextBackgroundOn=(void (stdcall *)(gui_text_t *Text))
|
||
|
gui_cofflib_getproc(exp,imports[38]);
|
||
|
TextBackgroundOff=(void (stdcall *)(gui_text_t *Text))
|
||
|
gui_cofflib_getproc(exp,imports[39]);
|
||
|
LoadFont=(font_t* (stdcall *)(char *fullfontname))
|
||
|
gui_cofflib_getproc(exp,imports[40]);
|
||
|
FreeFont=(void (stdcall *)(font_t *font))
|
||
|
gui_cofflib_getproc(exp,imports[41]);
|
||
|
}
|
||
|
|
||
|
void LoadLibGUI(char *lib_path)
|
||
|
{
|
||
|
import_t *export;
|
||
|
char *path;
|
||
|
DWORD vers;
|
||
|
|
||
|
if (lib_path==NULL)
|
||
|
{
|
||
|
path=sys_libGUI_path;
|
||
|
export=(import_t*)gui_ksys_load_dll(path);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
path=lib_path;
|
||
|
export=(import_t*)gui_ksys_load_dll(path);
|
||
|
}
|
||
|
|
||
|
if (export==NULL)
|
||
|
{
|
||
|
gui_debug_out_str("\ncan't load lib=");
|
||
|
gui_debug_out_str(path);
|
||
|
gui_ksys_exit(0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
link_libGUI(export,funcnames);
|
||
|
if (InitLibGUI())
|
||
|
{
|
||
|
gui_debug_out_str("\ncan't initialize libGUI");
|
||
|
gui_ksys_exit(0);
|
||
|
}
|
||
|
gui_debug_out_str(" initialized");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|