Subversion Repositories Kolibri OS

Rev

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

  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.  
  240.  
  241.  
  242.