diff --git a/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.c b/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.c new file mode 100755 index 0000000000..a60f5c359b --- /dev/null +++ b/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.c @@ -0,0 +1,243 @@ +/* + 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"); + } +} + + + + diff --git a/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.h b/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.h new file mode 100755 index 0000000000..5f0c5c0351 --- /dev/null +++ b/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.h @@ -0,0 +1,591 @@ +/* + service structures of libGUI +*/ +#define NULL (void*)0 + +typedef unsigned int DWORD; +typedef unsigned char BYTE; +typedef unsigned short int WORD; +typedef unsigned int size_t; + +#define stdcall __stdcall +#define cdecl __cdecl + +///////////////////////////////////////////////////////////////////////// +// libGUI sysyem messages types +///////////////////////////////////////////////////////////////////////// +#define MESSAGE_FULL_REDRAW_ALL 1 +#define MESSAGE_KEYS_EVENT 2 +#define MESSAGE_SPECIALIZED 3 +#define MESSAGE_SET_FOCUSE 4 +#define MESSAGE_CHANGE_FOCUSE 5 +#define MESSAGE_MOUSE_EVENT 6 +#define MESSAGE_CHANGE_POSITION_EVENT 7 +#define MESSAGE_CHANGESIZE_EVENT 8 +#define MESSAGE_CALL_TIMER_EVENT 9 +#define MESSAGE_FULL_REDRAW_ALL_WITH_FINITION 10 +#define MESSAGE_SET_MAIN_PARENT 11 +#define MESSAGE_DESTROY_CONTROL -1 + +///////////////////////////////////////////////////////////////////////// +// system keys states +///////////////////////////////////////////////////////////////////////// +#define KEY_DOWN 16 +#define KEY_UP 17 +#define KEY_HOTKEY 18 +///////////////////////////////////////////////////////////////////////// +// system mouse buttons states +///////////////////////////////////////////////////////////////////////// +#define MOUSE_LEFT_BUTTON_DOWN 19 +#define MOUSE_LEFT_BUTTON_UP 20 +#define MOUSE_RIGHT_BUTTON_DOWN 21 +#define MOUSE_RIGHT_BUTTON_UP 22 +#define MOUSE_MIDDLE_BUTTON_DOWN 23 +#define MOUSE_MIDDLE_BUTTON_UP 24 +#define MOUSE_4_BUTTON_DOWN 25 +#define MOUSE_4_BUTTON_UP 26 +#define MOUSE_5_BUTTON_DOWN 27 +#define MOUSE_5_BUTTON_UP 28 + + +//----------------------------------------------------------------------- +// CONNECT EVENTS FOR CALLBACKs +//----------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////// +// connect events for button +//////////////////////////////////////////////////////////////// +#define BUTTON_ENTER_EVENT 29 +#define BUTTON_LEAVE_EVENT 30 +#define BUTTON_PRESSED_EVENT 31 +#define BUTTON_RELEASED_EVENT 32 + +//////////////////////////////////////////////////////////////// +// connect events for scroll bar +//////////////////////////////////////////////////////////////// +#define SCROLLBAR_CHANGED_EVENT 33 + +//////////////////////////////////////////////////////////////// +// connect events for main parent window +//////////////////////////////////////////////////////////////// +#define DELETE_EVENT 36 + +//////////////////////////////////////////////////////////////// +// font type structure +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct FONT +{ + DWORD *fnt_draw; + DWORD *fnt_unpacker; + DWORD *fnt_fd; + DWORD *fnt_bk; + int sizex; + int sizey; + int size; + int encoding_type; + char *font; + char *fnt_name; + DWORD type; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct FONT font_t; + +//////////////////////////////////////////////////////////////// +// header of parent of control +//////////////////////////////////////////////////////////////// + +#pragma pack(push,1) +struct HEADERPARENT +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + DWORD **control_for_callback_function; + DWORD **callback_for_control_callback; + DWORD number_callbacks; + DWORD *global_active_control_for_keys; + DWORD *message; + DWORD *timer_bk; + DWORD *timer_fd; + DWORD number_timers_for_controls; + DWORD *calev_bk; + DWORD *calev_fd; + DWORD *IDL_func; + DWORD *IDL_func_data; +}; +#pragma pack(pop) + +typedef struct HEADERPARENT parent_t; + +//////////////////////////////////////////////////////////////// +// header of control +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct HEADER +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct HEADER header_t; +//////////////////////////////////////////////////////////////// +// callback structure for callback function of control +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct CALLBACK +{ + DWORD *clb_bk; + DWORD *clb_fd; + DWORD *clb_control; + DWORD *func; + DWORD *func_data; + DWORD connect_event; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct CALLBACK gui_callback_t; +//////////////////////////////////////////////////////////////// +// timer +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct TIMER +{ + DWORD *tmr_bk; + DWORD *tmr_fd; + DWORD *tmr_parent; + DWORD *func; + DWORD *func_data; + DWORD last_time; + DWORD time_tick; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct TIMER gui_timer_t; +//////////////////////////////////////////////////////////////// +// structure for callback events +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct CALLBACKEVENT +{ + DWORD *calev_bk; + DWORD *calev_fd; + DWORD *calev_parent; + DWORD *func; + DWORD *func_data; + DWORD event_type; +}; +#pragma pack(pop) + +typedef struct CALLBACKEVENT gui_callbackevent_t; + +//////////////////////////////////////////////////////////////// +// type of data - structure message +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct MESSAGE +{ + DWORD type; + DWORD arg1; + DWORD arg2; + DWORD arg3; + DWORD arg4; +}; +#pragma pack(pop) + +typedef struct MESSAGE gui_message_t; + +//////////////////////////////////////////////////////////////// +// button +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlButton +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //button's data + BYTE btn_flags; +}; +#pragma pack(pop) + +typedef struct ControlButton gui_button_t; + +// information for creating control Button +#pragma pack(push,1) +struct ButtonData +{ + int x; + int y; + int width; + int height; +}; +#pragma pack(pop) + +typedef struct ButtonData gui_button_data_t; + +//////////////////////////////////////////////////////////////// +// scroller +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlScrollBar +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //scroll bar's data + float ruller_size; + float ruller_pos; + float ruller_step; + BYTE scb_flags; +}; + +typedef struct ControlScrollBar gui_scroll_bar_t; + +#pragma pack(push,1) +struct ScrollBarData +{ + int x; + int y; + int width; + int height; + float ruller_size; + float ruller_pos; + float ruller_step; +}; +#pragma pack(pop) + +typedef struct ScrollBarData gui_scroll_bar_data_t; +//////////////////////////////////////////////////////////////// +// progressbar +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlProgressBar +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //progress bar's data + float progress; + BYTE prb_flags; +}; +#pragma pack(pop) + +typedef struct ControlProgressBar gui_progress_bar_t; + +#pragma pack(push,1) +struct ProgressBarData +{ + int x; + int y; + int width; + int height; + float progress; +}; +#pragma pack(pop) + +typedef struct ProgressBarData gui_progress_bar_data_t; +//////////////////////////////////////////////////////////////// +// scrolled window +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlScrolledWindow +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //scrolled windows's data + DWORD virtual_x; + DWORD virtual_y; + DWORD virtual_sizex; + DWORD virtual_sizey; + DWORD *virtual_controls_x; + DWORD *virtual_controls_y; + DWORD number_virtual_controls; + DWORD scroll_arrea_sizex; + DWORD scroll_arrea_sizey; + DWORD *horizontal_scroll; + DWORD *vertical_scroll; + BYTE scw_flags; +}; +#pragma pack(pop) + +typedef struct ControlScrolledWindow gui_scrolled_window_t; + +#pragma pack(push,1) +struct ScrolledWindowData +{ + int x; + int y; + int width; + int height; +}; +#pragma pack(pop) + +typedef struct ScrolledWindowData gui_scrolled_window_data_t; + +//////////////////////////////////////////////////////////////// +// image +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlImage +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + char bits_per_pixel; + char bytes_per_pixel; + char *img; +}; +#pragma pack(pop) + +typedef struct ControlImage gui_image_t; + +#pragma pack(push,1) +struct ImageData +{ + int x; + int y; + int width; + int height; + char bits_per_pixel; +}; +#pragma pack(pop) + +typedef struct ImageData gui_image_data_t; + +//////////////////////////////////////////////////////////////// +// text +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlText +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + DWORD *font; + DWORD color; + DWORD background_color; + char *text; + BYTE txt_flags; +}; +#pragma pack(pop) + +typedef struct ControlText gui_text_t; + +#pragma pack(push,1) +struct TextData +{ + int x; + int y; + DWORD *font; + DWORD color; + DWORD background_color; + char background; + char *text; +}; +#pragma pack(pop) + +typedef struct TextData gui_text_data_t; +///////////////////////////////////////////////////////////////// +// load libGUI library and link functions +///////////////////////////////////////////////////////////////// +void LoadLibGUI(char *lib_path); + +//********************************************************************** +// libGUI service functions +//********************************************************************** + +DWORD (stdcall *LibGUIversion)(void); +char (stdcall *InitLibGUI)(void); +void (stdcall *LibGUImain)(parent_t *WindowParent); +void (stdcall *QuitLibGUI)(parent_t *window); + +void* (stdcall *CreateWindow)(void); +void (stdcall *SetWindowSizeRequest)(parent_t *WindowParent,int size_x,int size_y); + +void (stdcall *PackControls)(void *Parent,void *control); +void (stdcall *DestroyControl)(void *control); +void (stdcall *SetControlSizeRequest)(void *Control,int new_size_x,int new_size_y); +int (stdcall *GetControlSizeX)(void *Control); +int (stdcall *GetControlSizeY)(void *Control); +void (stdcall *SetControlNewPosition)(void *Control,int new_x,int new_y); +int (stdcall *GetControlPositionX)(void *Control); +int (stdcall *GetControlPositionY)(void *Control); +void* (stdcall *SetFocuse)(void *Control); +void (stdcall *RedrawControl)(void *Control); +void (stdcall *SpecialRedrawControl)(void *Control); + +gui_callback_t* (stdcall *SetCallbackFunction)(void *Control, + int event_name,void *callback_func, + void *callback_func_data); +void (stdcall *BlockCallbackFunction)(void *Control,gui_callback_t *callback_ID); +void (stdcall *UnblockCallbackFunction)(void *Control,gui_callback_t *callback_ID); + +void (stdcall *SetIDL_Function)(parent_t *Parent,void *function,void *function_data); +void (stdcall *DestroyIDL_Function)(parent_t *Parent); + +gui_timer_t* (stdcall *SetTimerCallbackForFunction)(parent_t *parent_window, + int time_tick,void *func,void *func_data); +void (stdcall *DestroyTimerCallbackForFunction)(gui_timer_t *timer); + +gui_callbackevent_t* (stdcall *SetCallbackFunctionForEvent)(parent_t *parent_window, + int event_type,void *func,void *func_data); +void (stdcall *DestroyCallbackFunctionForEvent)(gui_callbackevent_t *callback_event); + +gui_button_t* (stdcall *CreateButton)(gui_button_data_t *info_for_control); +gui_button_t* (stdcall *CreateButtonWithText)(gui_button_data_t *info,char *txt); + +gui_progress_bar_t* (stdcall *CreateProgressBar)(gui_progress_bar_data_t *info_for_control); +void (stdcall *SetProgressBarPulse)(gui_progress_bar_t *ProgressBar,int time_update); +void (stdcall *ProgressBarSetText)(gui_progress_bar_t *pbar,char *txt); +char* (stdcall *ProgressBarGetText)(gui_progress_bar_t *pbar); + +gui_scroll_bar_t* (stdcall *CreateHorizontalScrollBar)(gui_scroll_bar_data_t *info_for_control); +gui_scroll_bar_t* (stdcall *CreateVerticalScrollBar)(gui_scroll_bar_data_t *info_for_control); + +gui_scrolled_window_t* (stdcall *CreateScrolledWindow)(gui_scrolled_window_data_t *info_for_control); +void (stdcall *ScrolledWindowPackControls)(gui_scrolled_window_t *parent,void *Control); + +gui_image_t* (stdcall *CreateImage)(gui_image_data_t *info_for_control); + +gui_text_t* (stdcall *CreateText)(gui_text_data_t *info_for_control); +void (stdcall *TextBackgroundOn)(gui_text_t *Text); +void (stdcall *TextBackgroundOff)(gui_text_t *Text); + +font_t* (stdcall *LoadFont)(char *fullfontname); +void (stdcall *FreeFont)(font_t *font); + diff --git a/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.c b/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.c new file mode 100755 index 0000000000..3c9f1fd527 --- /dev/null +++ b/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.c @@ -0,0 +1,241 @@ +/* + 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; + + 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); + } + } +} + + + + diff --git a/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.h b/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.h new file mode 100755 index 0000000000..556d591e10 --- /dev/null +++ b/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.h @@ -0,0 +1,589 @@ +/* + service structures of libGUI +*/ +#define NULL (void*)0 + +typedef unsigned int DWORD; +typedef unsigned char BYTE; +typedef unsigned short int WORD; +typedef unsigned int size_t; + +#define stdcall __attribute__ ((stdcall)) +#define cdecl __attribute__ ((cdecl)) +#define pack __attribute__ ((packed)) + +///////////////////////////////////////////////////////////////////////// +// libGUI sysyem messages types +///////////////////////////////////////////////////////////////////////// +#define MESSAGE_FULL_REDRAW_ALL 1 +#define MESSAGE_KEYS_EVENT 2 +#define MESSAGE_SPECIALIZED 3 +#define MESSAGE_SET_FOCUSE 4 +#define MESSAGE_CHANGE_FOCUSE 5 +#define MESSAGE_MOUSE_EVENT 6 +#define MESSAGE_CHANGE_POSITION_EVENT 7 +#define MESSAGE_CHANGESIZE_EVENT 8 +#define MESSAGE_CALL_TIMER_EVENT 9 +#define MESSAGE_FULL_REDRAW_ALL_WITH_FINITION 10 +#define MESSAGE_SET_MAIN_PARENT 11 +#define MESSAGE_DESTROY_CONTROL -1 + +///////////////////////////////////////////////////////////////////////// +// system keys states +///////////////////////////////////////////////////////////////////////// +#define KEY_DOWN 16 +#define KEY_UP 17 +#define KEY_HOTKEY 18 +///////////////////////////////////////////////////////////////////////// +// system mouse buttons states +///////////////////////////////////////////////////////////////////////// +#define MOUSE_LEFT_BUTTON_DOWN 19 +#define MOUSE_LEFT_BUTTON_UP 20 +#define MOUSE_RIGHT_BUTTON_DOWN 21 +#define MOUSE_RIGHT_BUTTON_UP 22 +#define MOUSE_MIDDLE_BUTTON_DOWN 23 +#define MOUSE_MIDDLE_BUTTON_UP 24 +#define MOUSE_4_BUTTON_DOWN 25 +#define MOUSE_4_BUTTON_UP 26 +#define MOUSE_5_BUTTON_DOWN 27 +#define MOUSE_5_BUTTON_UP 28 + + +//----------------------------------------------------------------------- +// CONNECT EVENTS FOR CALLBACKs +//----------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////// +// connect events for button +//////////////////////////////////////////////////////////////// +#define BUTTON_ENTER_EVENT 29 +#define BUTTON_LEAVE_EVENT 30 +#define BUTTON_PRESSED_EVENT 31 +#define BUTTON_RELEASED_EVENT 32 + +//////////////////////////////////////////////////////////////// +// connect events for scroll bar +//////////////////////////////////////////////////////////////// +#define SCROLLBAR_CHANGED_EVENT 33 + +//////////////////////////////////////////////////////////////// +// connect events for main parent window +//////////////////////////////////////////////////////////////// +#define DELETE_EVENT 36 + +//////////////////////////////////////////////////////////////// +// font type structure +//////////////////////////////////////////////////////////////// +struct FONT +{ + DWORD *fnt_draw; + DWORD *fnt_unpacker; + DWORD *fnt_fd; + DWORD *fnt_bk; + int sizex; + int sizey; + int size; + int encoding_type; + char *font; + char *fnt_name; + DWORD type; + DWORD flags; +}pack; + +typedef struct FONT font_t; + +//////////////////////////////////////////////////////////////// +// header of parent of control +//////////////////////////////////////////////////////////////// + +struct HEADERPARENT +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + DWORD **control_for_callback_function; + DWORD **callback_for_control_callback; + DWORD number_callbacks; + DWORD *global_active_control_for_keys; + DWORD *message; + DWORD *timer_bk; + DWORD *timer_fd; + DWORD number_timers_for_controls; + DWORD *calev_bk; + DWORD *calev_fd; + DWORD *IDL_func; + DWORD *IDL_func_data; +}pack; + +typedef struct HEADERPARENT parent_t; + +//////////////////////////////////////////////////////////////// +// header of control +//////////////////////////////////////////////////////////////// + +struct HEADER +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; +}pack; + + +typedef struct HEADER header_t; +//////////////////////////////////////////////////////////////// +// callback structure for callback function of control +//////////////////////////////////////////////////////////////// + +struct CALLBACK +{ + DWORD *clb_bk; + DWORD *clb_fd; + DWORD *clb_control; + DWORD *func; + DWORD *func_data; + DWORD connect_event; + DWORD flags; +}pack; + + +typedef struct CALLBACK gui_callback_t; +//////////////////////////////////////////////////////////////// +// timer +//////////////////////////////////////////////////////////////// + +struct TIMER +{ + DWORD *tmr_bk; + DWORD *tmr_fd; + DWORD *tmr_parent; + DWORD *func; + DWORD *func_data; + DWORD last_time; + DWORD time_tick; + DWORD flags; +}pack; + + +typedef struct TIMER gui_timer_t; +//////////////////////////////////////////////////////////////// +// structure for callback events +//////////////////////////////////////////////////////////////// + +struct CALLBACKEVENT +{ + DWORD *calev_bk; + DWORD *calev_fd; + DWORD *calev_parent; + DWORD *func; + DWORD *func_data; + DWORD event_type; +}pack; + + +typedef struct CALLBACKEVENT gui_callbackevent_t; + +//////////////////////////////////////////////////////////////// +// type of data - structure message +//////////////////////////////////////////////////////////////// + +struct MESSAGE +{ + DWORD type; + DWORD arg1; + DWORD arg2; + DWORD arg3; + DWORD arg4; +}pack; + + +typedef struct MESSAGE gui_message_t; + +//////////////////////////////////////////////////////////////// +// button +//////////////////////////////////////////////////////////////// + +struct ControlButton +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //button's data + BYTE btn_flags; +}pack; + + +typedef struct ControlButton gui_button_t; + +// information for creating control Button + +struct ButtonData +{ + int x; + int y; + int width; + int height; +}pack; + + +typedef struct ButtonData gui_button_data_t; + +//////////////////////////////////////////////////////////////// +// scroller +//////////////////////////////////////////////////////////////// + +struct ControlScrollBar +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //scroll bar's data + float ruller_size; + float ruller_pos; + float ruller_step; + BYTE scb_flags; +}pack; + + +typedef struct ControlScrollBar gui_scroll_bar_t; + + +struct ScrollBarData +{ + int x; + int y; + int width; + int height; + float ruller_size; + float ruller_pos; + float ruller_step; +}pack; + + +typedef struct ScrollBarData gui_scroll_bar_data_t; +//////////////////////////////////////////////////////////////// +// progressbar +//////////////////////////////////////////////////////////////// + +struct ControlProgressBar +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //progress bar's data + float progress; + BYTE prb_flags; +}pack; + + +typedef struct ControlProgressBar gui_progress_bar_t; + + +struct ProgressBarData +{ + int x; + int y; + int width; + int height; + float progress; +}pack; + + +typedef struct ProgressBarData gui_progress_bar_data_t; +//////////////////////////////////////////////////////////////// +// scrolled window +//////////////////////////////////////////////////////////////// + +struct ControlScrolledWindow +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //scrolled windows's data + DWORD virtual_x; + DWORD virtual_y; + DWORD virtual_sizex; + DWORD virtual_sizey; + DWORD *virtual_controls_x; + DWORD *virtual_controls_y; + DWORD number_virtual_controls; + DWORD scroll_arrea_sizex; + DWORD scroll_arrea_sizey; + DWORD *horizontal_scroll; + DWORD *vertical_scroll; + BYTE scw_flags; +}pack; + + +typedef struct ControlScrolledWindow gui_scrolled_window_t; + + +struct ScrolledWindowData +{ + int x; + int y; + int width; + int height; +}pack; + + +typedef struct ScrolledWindowData gui_scrolled_window_data_t; + +//////////////////////////////////////////////////////////////// +// image +//////////////////////////////////////////////////////////////// + +struct ControlImage +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + char bits_per_pixel; + char bytes_per_pixel; + char *img; +}pack; + + +typedef struct ControlImage gui_image_t; + + +struct ImageData +{ + int x; + int y; + int width; + int height; + char bits_per_pixel; +}pack; + + +typedef struct ImageData gui_image_data_t; + +//////////////////////////////////////////////////////////////// +// text +//////////////////////////////////////////////////////////////// + +struct ControlText +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + DWORD *font; + DWORD color; + DWORD background_color; + char *text; + BYTE txt_flags; +}pack; + + +typedef struct ControlText gui_text_t; + + +struct TextData +{ + int x; + int y; + DWORD *font; + DWORD color; + DWORD background_color; + char background; + char *text; +}pack; + + +typedef struct TextData gui_text_data_t; +///////////////////////////////////////////////////////////////// +// load libGUI library and link functions +///////////////////////////////////////////////////////////////// +void LoadLibGUI(char *lib_path); + +//********************************************************************** +// libGUI service functions +//********************************************************************** + +DWORD stdcall (*LibGUIversion)(void); +char stdcall (*InitLibGUI)(void); +void stdcall (*LibGUImain)(parent_t *WindowParent); +void stdcall (*QuitLibGUI)(parent_t *window); + +void* stdcall (*CreateWindow)(void); +void stdcall (*SetWindowSizeRequest)(parent_t *WindowParent,int size_x,int size_y); + +void stdcall (*PackControls)(void *Parent,void *control); +void stdcall (*DestroyControl)(void *control); +void stdcall (*SetControlSizeRequest)(void *Control,int new_size_x,int new_size_y); +int stdcall (*GetControlSizeX)(void *Control); +int stdcall (*GetControlSizeY)(void *Control); +void stdcall (*SetControlNewPosition)(void *Control,int new_x,int new_y); +int stdcall (*GetControlPositionX)(void *Control); +int stdcall (*GetControlPositionY)(void *Control); +void* stdcall (*SetFocuse)(void *Control); +void stdcall (*RedrawControl)(void *Control); +void stdcall (*SpecialRedrawControl)(void *Control); + +gui_callback_t* stdcall (*SetCallbackFunction)(void *Control, + int event_name,void *callback_func, + void *callback_func_data); +void stdcall (*BlockCallbackFunction)(void *Control,gui_callback_t *callback_ID); +void stdcall (*UnblockCallbackFunction)(void *Control,gui_callback_t *callback_ID); + +void stdcall (*SetIDL_Function)(parent_t *Parent,void *function,void *function_data); +void stdcall (*DestroyIDL_Function)(parent_t *Parent); + +gui_timer_t* stdcall (*SetTimerCallbackForFunction)(parent_t *parent_window, + int time_tick,void *func,void *func_data); +void stdcall (*DestroyTimerCallbackForFunction)(gui_timer_t *timer); + +gui_callbackevent_t* stdcall (*SetCallbackFunctionForEvent)(parent_t *parent_window, + int event_type,void *func,void *func_data); +void stdcall (*DestroyCallbackFunctionForEvent)(gui_callbackevent_t *callback_event); + +gui_button_t* stdcall (*CreateButton)(gui_button_data_t *info_for_control); +gui_button_t* stdcall (*CreateButtonWithText)(gui_button_data_t *info,char *txt); + +gui_progress_bar_t* stdcall (*CreateProgressBar)(gui_progress_bar_data_t *info_for_control); +void stdcall (*SetProgressBarPulse)(gui_progress_bar_t *ProgressBar,int time_update); +void stdcall (*ProgressBarSetText)(gui_progress_bar_t *pbar,char *txt); +char* stdcall (*ProgressBarGetText)(gui_progress_bar_t *pbar); + +gui_scroll_bar_t* stdcall (*CreateHorizontalScrollBar)(gui_scroll_bar_data_t *info_for_control); +gui_scroll_bar_t* stdcall (*CreateVerticalScrollBar)(gui_scroll_bar_data_t *info_for_control); + +gui_scrolled_window_t* stdcall (*CreateScrolledWindow)(gui_scrolled_window_data_t *info_for_control); +void stdcall (*ScrolledWindowPackControls)(gui_scrolled_window_t *parent,void *Control); + +gui_image_t* stdcall (*CreateImage)(gui_image_data_t *info_for_control); + +gui_text_t* stdcall (*CreateText)(gui_text_data_t *info_for_control); +void stdcall (*TextBackgroundOn)(gui_text_t *Text); +void stdcall (*TextBackgroundOff)(gui_text_t *Text); + +font_t* stdcall (*LoadFont)(char *fullfontname); +void stdcall (*FreeFont)(font_t *font); + diff --git a/programs/develop/new libGUI_C/SRC/compilation/MinGW/Makefile b/programs/develop/new libGUI_C/SRC/compilation/MinGW/Makefile new file mode 100755 index 0000000000..fddfa44985 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/compilation/MinGW/Makefile @@ -0,0 +1,11 @@ +SRC = libGUI.c +TARGET = libGUI.obj +CFLAGS = -O2 -nostdinc -nostdlib -march=pentium -fomit-frame-pointer -fno-builtin +CC = gcc +AR=ar + +all: + $(CC) -c $(SRC) $(CFLAGS) -o $(TARGET) +clean: + rm *.obj + rm $(TARGET) diff --git a/programs/develop/new libGUI_C/SRC/compilation/MinGW/build.bat b/programs/develop/new libGUI_C/SRC/compilation/MinGW/build.bat new file mode 100755 index 0000000000..e84050b7c1 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/compilation/MinGW/build.bat @@ -0,0 +1,2 @@ +gcc -c -O2 -nostdinc -nostdlib -march=pentium -fomit-frame-pointer -fno-builtin -o libGUI.obj libGUI.c +@pause diff --git a/programs/develop/new libGUI_C/SRC/control_button.h b/programs/develop/new libGUI_C/SRC/control_button.h new file mode 100755 index 0000000000..1c1434f79f --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_button.h @@ -0,0 +1,11 @@ +/* + control button data +*/ + +#define FLAG_INSERT_BUTTON_ON 0x1; +#define FLAG_INSERT_BUTTON_OFF 0xfe; +#define FLAG_PRESSED_BUTTON_ON 0x2 +#define FLAG_PRESSED_BUTTON_OFF 0xfd +#define FLAG_RELEASED_BUTTON_ON 0x4 +#define FLAG_RELEASED_BUTTON_OFF 0xfb + diff --git a/programs/develop/new libGUI_C/SRC/control_button.inc b/programs/develop/new libGUI_C/SRC/control_button.inc new file mode 100755 index 0000000000..4f0d47841b --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_button.inc @@ -0,0 +1,411 @@ +/* + control Button +*/ + +void DrawFocuseForButton(struct ControlButton *Button) +{ + int x; + int y; + int sizex; + int sizey; + struct FINITION *fin; + + x=Button->ctrl_x; + y=Button->ctrl_y; + sizex=Button->ctrl_sizex; + sizey=Button->ctrl_sizey; + fin=(struct FINITION*)Button->finition; + + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,0xbfff); +} + +void DrawPressedButton(struct ControlButton *Button) +{ + int x; + int y; + int sizex; + int sizey; + struct FINITION *fin; + gui_message_t message; + + x=Button->ctrl_x; + y=Button->ctrl_y; + sizex=Button->ctrl_sizex; + sizey=Button->ctrl_sizey; + fin=(struct FINITION*)Button->finition; + + Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y,sizex,sizey/2,COLOR_FON,COLOR_MIDDLE_LIGHT); + Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y+sizey/2,sizex,sizey/2,COLOR_MIDDLE_LIGHT,COLOR_FON); + + + Draw(fin,TOOL_HORIZONTAL_LINE,x,x+sizex-1,y,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_VERTICAL_LINE,x,y,y+sizey-1,COLOR_LIGHT); + Draw(fin,TOOL_HORIZONTAL_LINE,x,x+sizex-1,y+sizey-1,COLOR_LIGHT); + Draw(fin,TOOL_VERTICAL_LINE,x,y,y+sizey-1,COLOR_ABSOLUTE_DARK); + + if (fin->flags & FINITION_ON) + { + message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + message.arg1=fin->x; + message.arg2=fin->y; + message.arg3=fin->sizex; + message.arg4=fin->sizey; + } + else + { + message.type=MESSAGE_FULL_REDRAW_ALL; + } + + SendMessage((struct HEADER*)Button,&message); + + if (Button->flags & FLAG_FOCUSE_INPUT_ON) DrawFocuseForButton(Button); +} + +void DrawInsertButton(struct ControlButton *Button) +{ + int x; + int y; + int sizex; + int sizey; + struct FINITION *fin; + + x=Button->ctrl_x; + y=Button->ctrl_y; + sizex=Button->ctrl_sizex; + sizey=Button->ctrl_sizey; + fin=(struct FINITION*)Button->finition; + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_INSERT); +} + +void DrawButton(struct ControlButton *Button) +{ + int x; + int y; + int sizex; + int sizey; + struct FINITION *fin; + gui_message_t message; + + x=Button->ctrl_x; + y=Button->ctrl_y; + sizex=Button->ctrl_sizex; + sizey=Button->ctrl_sizey; + fin=(struct FINITION*)Button->finition; + + Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x,y,sizex,sizey,COLOR_FON,COLOR_MIDDLE_LIGHT); + //Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y+sizey/2,sizex,sizey/2,COLOR_FON,COLOR_MIDDLE_LIGHT); + + + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK); + + Draw(fin,TOOL_HORIZONTAL_LINE,x+1,x+sizex-2,y+1,COLOR_LIGHT); + Draw(fin,TOOL_VERTICAL_LINE,x+sizex-2,y+1,y+sizey-2,COLOR_MIDDLE_LIGHT); + Draw(fin,TOOL_HORIZONTAL_LINE,x+1,x+sizex-2,y+sizey-2,COLOR_MIDDLE_LIGHT); + Draw(fin,TOOL_VERTICAL_LINE,x+1,y+1,y+sizey-2,COLOR_LIGHT); + + if (Button->child_bk!=NULL) + { + if (fin->flags & FINITION_ON) + { + message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + message.arg1=fin->x; + message.arg2=fin->y; + message.arg3=fin->sizex; + message.arg4=fin->sizey; + } + else + { + message.type=MESSAGE_FULL_REDRAW_ALL; + } + SendMessage((struct HEADER*)Button,&message); + } + if (Button->flags & FLAG_FOCUSE_INPUT_ON) DrawFocuseForButton(Button); +} + +//--------------------------------------------------------------------------------- +// control Button +//--------------------------------------------------------------------------------- +void ButtonProc(struct ControlButton *button,struct MESSAGE *message) +{ + int x,y,btn_state; + char v; + struct TIMER *timer; + struct FINITION *fin; + parent_t *main_parent; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //draw button + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + fin=(struct FINITION*)button->finition; + fin->flags=fin->flags | FINITION_ON; + fin->x=message->arg1; + fin->y=message->arg2; + fin->sizex=message->arg3; + fin->sizey=message->arg4; + DrawButton(button); + break; + } + case MESSAGE_KEYS_EVENT: + { + main_parent=(parent_t*)button->main_parent; + //not relazed yet + if (button->flags & FLAG_FOCUSE_INPUT_ON) + { + if (message->arg1==KEY_DOWN) + { + if (message->arg2==SC_SPACE) + { + button->btn_flags=button->btn_flags | FLAG_PRESSED_BUTTON_ON; + + if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT)!=NULL) + { + button->flags=button->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)button; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT); + main_parent->number_callbacks++; + } + if (button->flags & FLAG_SHOW_CONTROL) DrawPressedButton(button); + } + } + else + { + if (message->arg2==SC_SPACE) + { + button->btn_flags=button->btn_flags | FLAG_RELEASED_BUTTON_ON; + button->btn_flags=button->btn_flags & FLAG_PRESSED_BUTTON_OFF; + + if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT)!=NULL) + { + button->flags=button->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)button; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT); + main_parent->number_callbacks++; + } + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + } + } + } + break; + } + case MESSAGE_SPECIALIZED: + { + if (button->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON) + { + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + button->flags=button->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF; + } + break; + } + case MESSAGE_MOUSE_EVENT: + { //check press of mouse buttons + x=message->arg1; + y=message->arg2; + main_parent=(parent_t*)button->main_parent; + + if (message->arg3==MOUSE_LEFT_BUTTON_UP) + { + //insert of button + if (CheckCrossBox((struct HEADER*)button,x,y)==TRUE) + { + v=button->btn_flags & FLAG_INSERT_BUTTON_ON; + if ((ControlCheckCallbackEvent(button,(DWORD)BUTTON_ENTER_EVENT)!=NULL) && (v==FALSE)) + { + button->flags=button->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)button; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_ENTER_EVENT); + main_parent->number_callbacks++; + } + button->btn_flags=button->btn_flags | FLAG_INSERT_BUTTON_ON; + + if (button->flags & FLAG_SHOW_CONTROL) DrawInsertButton(button); + } + else + { + v=button->btn_flags & FLAG_INSERT_BUTTON_ON; + if (v==TRUE) + { + if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_LEAVE_EVENT)!=NULL) + { + button->flags=button->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)button; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_LEAVE_EVENT); + main_parent->number_callbacks++; + } + button->btn_flags=button->btn_flags & FLAG_INSERT_BUTTON_OFF; + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + } + } + + if (button->btn_flags & FLAG_PRESSED_BUTTON_ON) + { + button->btn_flags=button->btn_flags & FLAG_PRESSED_BUTTON_OFF; + button->btn_flags=button->btn_flags | FLAG_RELEASED_BUTTON_ON; + + if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT)!=NULL) + { + button->flags=button->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)button; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT); + main_parent->number_callbacks++; + } + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + } + + + } + else + { + if (CheckCrossBox((struct HEADER*)button,x,y)==TRUE) + { + if (message->arg3==MOUSE_LEFT_BUTTON_DOWN) + { + button->btn_flags=button->btn_flags | FLAG_PRESSED_BUTTON_ON; + } + } + + if ((message->arg3==MOUSE_LEFT_BUTTON_DOWN) && (button->btn_flags & FLAG_PRESSED_BUTTON_ON)) + { + if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT)!=NULL) + { + button->flags=button->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)button; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT); + main_parent->number_callbacks++; + } + if (button->flags & FLAG_SHOW_CONTROL) DrawPressedButton(button); + } + } + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + button->ctrl_x=button->ctrl_x+message->arg1; + button->ctrl_y=button->ctrl_y+message->arg2; + break; + } + case MESSAGE_CALL_TIMER_EVENT: + { + if (button->timer!=(DWORD*)NULL) + { + timer=(struct TIMER*)button->timer; + if (timer->flags & FLAG_TIMER_ON) Timer(timer); + } + break; + } + case MESSAGE_SET_FOCUSE: + { + button->flags=button->flags | FLAG_FOCUSE_INPUT_ON; + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + break; + } + case MESSAGE_CHANGE_FOCUSE: + { + button->flags=button->flags & FLAG_FOCUSE_INPUT_OFF; + if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button); + break; + } + case MESSAGE_DESTROY_CONTROL: + { + if (button->timer!=(DWORD*)NULL) free(button->timer); + free(button->finition); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + SendMessage((struct HEADER*)button,message); + button->main_parent=(DWORD*)message->arg1; + break; + } + default: break; + } + //send message to child controls(if there is) + SendMessage((struct HEADER*)button,message); +} + +//--------------------------------------------------------------------------------- +// create control Button +//--------------------------------------------------------------------------------- +void* CreateButton(struct ButtonData *info_for_control) +{ + struct ControlButton *Button; + struct FINITION *fin; + + Button=malloc(sizeof(struct ControlButton)); + Button->finition=malloc(sizeof(struct FINITION)); + fin=(struct FINITION*)Button->finition; + fin->flags=0; + + ID++; +#ifdef DEBUG + printf("\ncreated button with ID=%d",(int)ID); +#endif + Button->child_bk=(DWORD*)NULL; + Button->child_fd=(DWORD*)NULL; + Button->active_control_for_keys=(DWORD*)NULL; + Button->active_control_for_mouse=(DWORD*)NULL; + Button->callback=(DWORD*)NULL; + Button->timer=(DWORD*)NULL; + + Button->ctrl_proc=(DWORD*)&ButtonProc; + Button->ctrl_x=info_for_control->x; + Button->ctrl_y=info_for_control->y; + Button->ctrl_sizex=info_for_control->width; + Button->ctrl_sizey=info_for_control->height; + Button->ctrl_ID=ID; + Button->flags=0; + Button->flags=Button->flags | FLAG_SHOW_CONTROL; + Button->flags=Button->flags | FLAG_FOCUSE_INPUT_SUPPOROTE; + + Button->btn_flags=0; + + return(Button); +} + +void* CreateButtonWithText(gui_button_data_t *info,char *txt) +{ + gui_button_t *Button; + gui_text_t *text; + gui_text_data_t txtdata; + int len; + + Button=CreateButton(info); + len=strlen(txt); + + txtdata.x=0; + txtdata.y=0; + txtdata.font=NULL; + txtdata.background=FALSE; + txtdata.color=0; + txtdata.text=malloc(len); + memmove(txtdata.text,txt,len); + text=CreateText(&txtdata); + + if (text->ctrl_sizex>Button->ctrl_sizex) Button->ctrl_sizex=text->ctrl_sizex+6; + if (text->ctrl_sizey>Button->ctrl_sizey) Button->ctrl_sizey=text->ctrl_sizey+6; + + text->ctrl_x=(Button->ctrl_sizex/2)-(text->ctrl_sizex/2); + text->ctrl_y=(Button->ctrl_sizey/2)-(text->ctrl_sizey/2); + PackControls(Button,text); + + return(Button); +} + diff --git a/programs/develop/new libGUI_C/SRC/control_image.h b/programs/develop/new libGUI_C/SRC/control_image.h new file mode 100755 index 0000000000..e69de29bb2 diff --git a/programs/develop/new libGUI_C/SRC/control_image.inc b/programs/develop/new libGUI_C/SRC/control_image.inc new file mode 100755 index 0000000000..7201112c4b --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_image.inc @@ -0,0 +1,162 @@ +/* + control Image +*/ + +void DisplayImage(gui_image_t *Image) +{ + int x; + int y; + int sizex; + int sizey; + struct FINITION *fin; + + x=Image->ctrl_x; + y=Image->ctrl_y; + sizex=Image->ctrl_sizex; + sizey=Image->ctrl_sizey; + fin=(struct FINITION*)Image->finition; + + Draw(fin,TOOL_IMAGE,x,y,sizex,sizey,Image->bits_per_pixel,Image->img); +} + +//--------------------------------------------------------------------------------- +// control Image +//--------------------------------------------------------------------------------- +void ImageProc(gui_image_t *Image,gui_message_t *message) +{ + finition_t *fin; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //draw Image + if (Image->flags & FLAG_SHOW_CONTROL) DisplayImage(Image); + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + fin=(struct FINITION*)Image->finition; + fin->flags=fin->flags | FINITION_ON; + fin->x=message->arg1; + fin->y=message->arg2; + fin->sizex=message->arg3; + fin->sizey=message->arg4; + DisplayImage(Image); + break; + } + case MESSAGE_SPECIALIZED: + { + if (Image->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON) + { + if (Image->flags & FLAG_SHOW_CONTROL) DisplayImage(Image); + Image->flags=Image->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF; + } + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + Image->ctrl_x=Image->ctrl_x+message->arg1; + Image->ctrl_y=Image->ctrl_y+message->arg2; + break; + } + case MESSAGE_DESTROY_CONTROL: + { + free(Image->finition); + free(Image->img); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + SendMessage((struct HEADER*)Image,message); + Image->main_parent=(DWORD*)message->arg1; + break; + } + + default: break; + } + //send message to child controls(if there is) + SendMessage((struct HEADER*)Image,message); +} + +//--------------------------------------------------------------------------------- +// create control Image +//--------------------------------------------------------------------------------- +void* CreateImage(struct ImageData *info_for_control) +{ + gui_image_t *Image; + finition_t *fin; + DWORD sizemem; + + Image=malloc(sizeof(struct ControlImage)); + Image->finition=malloc(sizeof(struct FINITION)); + fin=(struct FINITION*)Image->finition; + fin->flags=0; + + ID++; +#ifdef DEBUG + printf("\ncreated image with ID=%d",(int)ID); +#endif + Image->child_bk=(DWORD*)NULL; + Image->child_fd=(DWORD*)NULL; + Image->active_control_for_keys=(DWORD*)NULL; + Image->active_control_for_mouse=(DWORD*)NULL; + Image->callback=(DWORD*)NULL; + Image->timer=(DWORD*)NULL; + + Image->ctrl_proc=(DWORD*)&ImageProc; + Image->ctrl_x=(DWORD)info_for_control->x; + Image->ctrl_y=(DWORD)info_for_control->y; + Image->ctrl_sizex=(DWORD)info_for_control->width; + Image->ctrl_sizey=(DWORD)info_for_control->height; + Image->bits_per_pixel=info_for_control->bits_per_pixel; + Image->ctrl_ID=ID; + Image->flags=0; + Image->flags=Image->flags | FLAG_SHOW_CONTROL; + + switch(Image->bits_per_pixel) + { + case 32: + { + sizemem=(Image->ctrl_sizex*Image->ctrl_sizey)*4; + Image->bytes_per_pixel=4; + break; + } + case 24: + { + sizemem=(Image->ctrl_sizex*Image->ctrl_sizey)*3; + Image->bytes_per_pixel=3; + break; + } + case 16: + { + sizemem=(Image->ctrl_sizex*Image->ctrl_sizey)*2; + Image->bytes_per_pixel=2; + break; + } + case 15: + { + sizemem=(Image->ctrl_sizex*Image->ctrl_sizey)*2; + Image->bytes_per_pixel=2; + break; + } + case 8: + { + sizemem=Image->ctrl_sizex*Image->ctrl_sizey; + Image->bytes_per_pixel=1; + break; + } + case 4: + { + sizemem=((Image->ctrl_sizex*Image->ctrl_sizey)>>1)+1; + Image->bytes_per_pixel=0; + break; + } + default: return(NULL); + } + + Image->img=malloc(sizemem); + + return(Image); +} + diff --git a/programs/develop/new libGUI_C/SRC/control_progress_bar.h b/programs/develop/new libGUI_C/SRC/control_progress_bar.h new file mode 100755 index 0000000000..d8e8f46110 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_progress_bar.h @@ -0,0 +1,16 @@ +#define FLAG_PB_VERTICAL_ORIENTATION_ON 0x1 +#define FLAG_PB_HORIZONTAL_ORIENTATION_ON 0x2 +#define FLAG_PB_FROM_LEFT_TO_RIGHT_ON 0x4 +#define FLAG_PB_FROM_RIGHT_TO_LEFT_ON 0x8 +#define FLAG_PB_FROM_DOWN_TO_UP_ON 0x10 +#define FLAG_PB_FROM_UP_TO_DOWN_ON 0x20 +#define FLAG_PB_TEXT_ON 0x40 + +#define FLAG_PB_VERTICAL_ORIENTATION_OFF 0xfe +#define FLAG_PB_HORIZONTAL_ORIENTATION_OFF 0xfd +#define FLAG_PB_FROM_LEFT_TO_RIGHT_OFF 0xfb +#define FLAG_PB_FROM_RIGHT_TO_LEFT_OFF 0xf7 +#define FLAG_PB_FROM_DOWN_TO_UP_OFF 0xef +#define FLAG_PB_FROM_UP_TO_DOWN_OFF 0xdf +#define FLAG_PB_TEXT_OFF 0xbf + diff --git a/programs/develop/new libGUI_C/SRC/control_progress_bar.inc b/programs/develop/new libGUI_C/SRC/control_progress_bar.inc new file mode 100755 index 0000000000..7ea1d20780 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_progress_bar.inc @@ -0,0 +1,268 @@ +/* + control ProgressBar +*/ + + +void ProgressBarDrawProgress(struct ControlProgressBar *ProgressBar) +{ + int x; + int y; + int pos_progress; + int sizex; + int sizey; + char v; + struct FINITION *fin; + gui_message_t message; + gui_text_size_t size; + gui_text_t *Text; + + if ((ProgressBar->flags & FLAG_SHOW_CONTROL)==FALSE) return; + + x=ProgressBar->ctrl_x; + y=ProgressBar->ctrl_y; + sizex=ProgressBar->ctrl_sizex; + sizey=ProgressBar->ctrl_sizey; + fin=(struct FINITION*)ProgressBar->finition; + + if (ProgressBar->progress<0.0) ProgressBar->progress=0.0; + if (ProgressBar->progress>1.0) ProgressBar->progress=1.0; + + v=ProgressBar->prb_flags & FLAG_PB_HORIZONTAL_ORIENTATION_ON; + if (v!=FALSE) + { + pos_progress=(int)(ProgressBar->progress*(sizex-2)); + + if (ProgressBar->prb_flags & FLAG_PB_FROM_LEFT_TO_RIGHT_ON) + { + Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x+1,y+1,pos_progress,sizey-2,COLOR_FON,COLOR_MIDDLE_LIGHT); + Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x+1+pos_progress,y+1,sizex-2-pos_progress, + sizey-2,COLOR_MIDDLE_LIGHT,COLOR_LIGHT); + if (ProgressBar->prb_flags & FLAG_PB_TEXT_ON) + { + if (fin->flags & FINITION_ON) + { + message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + message.arg1=fin->x; + message.arg2=fin->y; + message.arg3=fin->sizex; + message.arg4=fin->sizey; + } + else + { + message.type=MESSAGE_FULL_REDRAW_ALL; + } + Text=(gui_text_t*)ProgressBar->child_bk; + size=GetStringSize((font_t*)Text->font,Text->text); + Text->ctrl_sizex=(DWORD)size.sizex; + Text->ctrl_sizey=(DWORD)size.sizey; + Text->ctrl_x=x+(sizex/2)-(Text->ctrl_sizex/2); + Text->ctrl_y=y+(sizey/2)-(Text->ctrl_sizey/2); + + SendMessage((struct HEADER*)ProgressBar,&message); + } + } + + if (ProgressBar->prb_flags & FLAG_PB_FROM_RIGHT_TO_LEFT_ON) + { + //Draw(fin,"filled_rectangle",x+sizex-pos_progress-1,y+1,x+sizex-1,sizey-2,0xff0000); + } + + } +} + +void DrawProgressBar(struct ControlProgressBar *ProgressBar) +{ + int x; + int y; + int sizex; + int sizey; + struct FINITION *fin; + + x=ProgressBar->ctrl_x; + y=ProgressBar->ctrl_y; + sizex=ProgressBar->ctrl_sizex; + sizey=ProgressBar->ctrl_sizey; + fin=(struct FINITION*)ProgressBar->finition; + + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x+1,y+1,sizex-2,sizey-2,COLOR_MIDDLE_LIGHT,COLOR_LIGHT); + ProgressBarDrawProgress(ProgressBar); + +} + +void SetProgressBarPulse(struct ControlProgressBar *ProgressBar,int time_tick) +{ + struct TIMER *timer; + struct HEADERPARENT *main_parent; + + main_parent=(struct HEADERPARENT*)ProgressBar->main_parent; + if (main_parent!=(struct HEADERPARENT*)NULL) + { + main_parent->number_timers_for_controls++; + + ProgressBar->timer=(DWORD*)SetTimerCallbackForControl(time_tick,&ProgressBarDrawProgress,ProgressBar); + timer=(struct TIMER*)ProgressBar->timer; + timer->flags=timer->flags | FLAG_TIMER_ON; + } +} + +//--------------------------------------------------------------------------------- +// control ProgressBar +//--------------------------------------------------------------------------------- +void ProgressBarProc(struct ControlProgressBar *ProgressBar,struct MESSAGE *message) +{ + int btn_state; + char v; + struct TIMER *timer; + struct FINITION *fin; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //draw ProgressBar + if (ProgressBar->flags & FLAG_SHOW_CONTROL) DrawProgressBar(ProgressBar); + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + fin=(struct FINITION*)ProgressBar->finition; + fin->flags=fin->flags | FINITION_ON; + fin->x=message->arg1; + fin->y=message->arg2; + fin->sizex=message->arg3; + fin->sizey=message->arg4; + DrawProgressBar(ProgressBar); + break; + } + case MESSAGE_SPECIALIZED: + { //redraw bar of progress + if (ProgressBar->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON) + { + if (ProgressBar->flags & FLAG_SHOW_CONTROL) ProgressBarDrawProgress(ProgressBar); + ProgressBar->flags=ProgressBar->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF; + } + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + ProgressBar->ctrl_x=ProgressBar->ctrl_x+message->arg1; + ProgressBar->ctrl_y=ProgressBar->ctrl_y+message->arg2; + break; + } + case MESSAGE_CALL_TIMER_EVENT: + { + if (ProgressBar->timer!=(DWORD*)NULL) + { + timer=(struct TIMER*)ProgressBar->timer; + if (timer->flags & FLAG_TIMER_ON) Timer(timer); + } + break; + } + case MESSAGE_DESTROY_CONTROL: + { + if (ProgressBar->timer!=(DWORD*)NULL) free(ProgressBar->timer); + free(ProgressBar->finition); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + SendMessage((struct HEADER*)ProgressBar,message); + ProgressBar->main_parent=(DWORD*)message->arg1; + break; + } + + default: break; + } + //send message to child controls(if there is) + SendMessage((struct HEADER*)ProgressBar,message); +} + +//--------------------------------------------------------------------------------- +// create control ProgressBar +//--------------------------------------------------------------------------------- +void* CreateProgressBarEmpty(struct ProgressBarData *info_for_control) +{ + struct ControlProgressBar *ProgressBar; + struct FINITION *fin; + + ProgressBar=malloc(sizeof(struct ControlProgressBar)); + ProgressBar->finition=malloc(sizeof(struct FINITION)); + fin=(struct FINITION*)ProgressBar->finition; + fin->flags=0; + + ID++; +#ifdef DEBUG + printf("\ncreated progress bar with ID=%d",(int)ID); +#endif + ProgressBar->child_bk=(DWORD*)NULL; + ProgressBar->child_fd=(DWORD*)NULL; + ProgressBar->active_control_for_keys=(DWORD*)NULL; + ProgressBar->active_control_for_mouse=(DWORD*)NULL; + ProgressBar->callback=(DWORD*)NULL; + ProgressBar->timer=(DWORD*)NULL; + ProgressBar->ctrl_proc=(DWORD*)&ProgressBarProc; + ProgressBar->ctrl_x=(DWORD)info_for_control->x; + ProgressBar->ctrl_y=(DWORD)info_for_control->y; + ProgressBar->ctrl_sizex=(DWORD)info_for_control->width; + ProgressBar->ctrl_sizey=(DWORD)info_for_control->height; + ProgressBar->ctrl_ID=ID; + ProgressBar->progress=info_for_control->progress; + ProgressBar->flags=0; + ProgressBar->flags=ProgressBar->flags | FLAG_SHOW_CONTROL; + + ProgressBar->prb_flags=0; + ProgressBar->prb_flags=ProgressBar->prb_flags | FLAG_PB_HORIZONTAL_ORIENTATION_ON; + ProgressBar->prb_flags=ProgressBar->prb_flags | FLAG_PB_FROM_LEFT_TO_RIGHT_ON; + + return(ProgressBar); +} + +void* CreateProgressBar(gui_progress_bar_data_t *info) +{ + gui_text_t *text; + gui_text_data_t txtdata; + gui_progress_bar_t *pbar; + + pbar=CreateProgressBarEmpty(info); + + txtdata.x=0; + txtdata.y=0; + txtdata.font=NULL; + txtdata.background=FALSE; + txtdata.color=0; + txtdata.text=malloc(1024); + txtdata.text[0]=0; + text=CreateText(&txtdata); + + text->ctrl_x=(pbar->ctrl_sizex/2)-(text->ctrl_sizex/2); + text->ctrl_y=(pbar->ctrl_sizey/2)-(text->ctrl_sizey/2); + PackControls(pbar,text); + + text->flags &=FLAG_HIDE_CONTROL; + + return(pbar); +} + +void ProgressBarSetText(gui_progress_bar_t *pbar,char *txt) +{ + gui_text_t *text; + + text=(gui_text_t*)pbar->child_bk; + + if (*txt!='\0') + { + pbar->prb_flags|=FLAG_PB_TEXT_ON; + memmove(text->text,txt,strlen(txt)); + text->flags |=FLAG_SHOW_CONTROL; + } +} + +char *ProgressBarGetText(gui_progress_bar_t *pbar) +{ + gui_text_t *text; + + text=(gui_text_t*)pbar->child_bk; + + return(text->text); +} diff --git a/programs/develop/new libGUI_C/SRC/control_scroll_bar.h b/programs/develop/new libGUI_C/SRC/control_scroll_bar.h new file mode 100755 index 0000000000..a24327e6ce --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_scroll_bar.h @@ -0,0 +1,6 @@ +#define FLAG_SCROLL_BAR_ORIENTATION_HORIZONTAL_ON 0x1 +#define FLAG_SCROLL_BAR_ORIENTATION_HORIZONTAL_OFF 0xfe +#define FLAG_SCROLL_BAR_ORIENTATION_VERTICAL_ON 0x2 +#define FLAG_SCROLL_BAR_ORIENTATION_VERTICAL_OFF 0xfd +#define FLAG_SCROLL_RULLER_PRESSED 0x4 +#define FLAG_SCROLL_RULLER_RELEASED 0xfb diff --git a/programs/develop/new libGUI_C/SRC/control_scroll_bar.inc b/programs/develop/new libGUI_C/SRC/control_scroll_bar.inc new file mode 100755 index 0000000000..e97e1b3160 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_scroll_bar.inc @@ -0,0 +1,801 @@ +/* + control ScrollBar +*/ + +//////////////////////////////////////////////////////////////////////////////// +// Draw Ruller +//////////////////////////////////////////////////////////////////////////////// +void DrawRuller(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + int scrollbar_size,ruller_size,ruller_pos; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + if (ScrollBar->scb_flags & FLAG_SCROLL_BAR_ORIENTATION_HORIZONTAL_ON) + { + scrollbar_size=sizex-sizey*2; + ruller_size=(int)(scrollbar_size*ScrollBar->ruller_size); + if (ruller_size<5) ruller_size=5; + if (ruller_size>sizex) ruller_size=sizex-2*sizey; + + ruller_pos=x+sizey+(int)((scrollbar_size-ruller_size)*ScrollBar->ruller_pos); + //left bar + Draw(fin,TOOL_FILLED_RECTANGLE,x+sizey,y+1,ruller_pos-x-sizey,sizey-2,COLOR_FON); + //right bar + Draw(fin,TOOL_FILLED_RECTANGLE,ruller_pos+ruller_size,y+1,x+sizex-sizey-ruller_pos-ruller_size,sizey-2,COLOR_FON); + //roller + Draw(fin,TOOL_RECTANGLE,ruller_pos,y,ruller_size,sizey,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,ruller_pos+1,y+1,ruller_size-2,sizey-2,COLOR_MIDDLE_LIGHT); + Draw(fin,TOOL_VERTICAL_LINE,ruller_pos+(ruller_size/2)-2,y+sizey/4,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_VERTICAL_LINE,ruller_pos+(ruller_size/2),y+sizey/4,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_VERTICAL_LINE,ruller_pos+(ruller_size/2)+2,y+sizey/4,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + } + + if (ScrollBar->scb_flags & FLAG_SCROLL_BAR_ORIENTATION_VERTICAL_ON) + { + scrollbar_size=sizey-sizex*2; + ruller_size=(int)(scrollbar_size*ScrollBar->ruller_size); + if (ruller_size<5) ruller_size=5; + if (ruller_size>sizey) ruller_size=sizey-2*sizex; + + ruller_pos=y+sizex+(int)((scrollbar_size-ruller_size)*ScrollBar->ruller_pos); + //up bar + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+sizex,sizex-2,ruller_pos-y-sizex,COLOR_FON); + //down bar + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,ruller_pos+ruller_size,sizex-2,y+sizey-sizex-ruller_pos-ruller_size,COLOR_FON); + //roller + Draw(fin,TOOL_RECTANGLE,x,ruller_pos,sizex,ruller_size,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,ruller_pos+1,sizex-2,ruller_size-2,COLOR_MIDDLE_LIGHT); + Draw(fin,TOOL_HORIZONTAL_LINE,x+sizex/4,x+(3*sizex)/4,ruller_pos+(ruller_size/2)-2,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_HORIZONTAL_LINE,x+sizex/4,x+(3*sizex)/4,ruller_pos+(ruller_size/2),COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_HORIZONTAL_LINE,x+sizex/4,x+(3*sizex)/4,ruller_pos+(ruller_size/2)+2,COLOR_ABSOLUTE_DARK); + } + +} + +//////////////////////////////////////////////////////////////////////////////// +// Draw full Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void DrawScrollBar(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + if (ScrollBar->scb_flags & FLAG_SCROLL_BAR_ORIENTATION_HORIZONTAL_ON) + { + + //draw child buttons and roller + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK); + //left button + Draw(fin,TOOL_RECTANGLE,x,y,sizey,sizey,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,sizey-2,sizey-2,COLOR_MIDDLE_LIGHT); + //left arrow of left button + Draw(fin,TOOL_LINE,x+sizey/3,y+sizey/2,x+(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizey/3,y+sizey/2,x+(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+1+(sizey/3),y+sizey/2,x+1+(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+1+(sizey/3),y+sizey/2,x+1+(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + //right button + Draw(fin,TOOL_RECTANGLE,x+sizex-sizey,y,sizey,sizey,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+sizex-sizey+1,y+1,sizey-2,sizey-2,COLOR_MIDDLE_LIGHT); + //right arrow of right button + Draw(fin,TOOL_LINE,x+sizex-sizey/3,y+sizey/2,x+sizex-(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-sizey/3,y+sizey/2,x+sizex-(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-1-(sizey/3),y+sizey/2,x+sizex-1-(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-1-(sizey/3),y+sizey/2,x+sizex-1-(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + //roller + DrawRuller(ScrollBar); + } + + if (ScrollBar->scb_flags & FLAG_SCROLL_BAR_ORIENTATION_VERTICAL_ON) + { + //draw child buttons and roller + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK); + //up button + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizex,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,sizex-2,sizex-2,COLOR_MIDDLE_LIGHT); + //up arrow of up button + Draw(fin,TOOL_LINE,x+sizex/2,y+sizex/3,x+sizex/4,y+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizex/3,x+(3*sizex)/4,y+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+1+(sizex/3),x+sizex/4,y+1+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+1+(sizex/3),x+(3*sizex)/4,y+1+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + //down button + Draw(fin,TOOL_RECTANGLE,x,y+sizey-sizex,sizex,sizex,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+sizey-sizex+1,sizex-2,sizex-2,COLOR_MIDDLE_LIGHT); + //down arrow of down button + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-sizex/3,x+sizex/4,y+sizey-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-sizex/3,x+(3*sizex)/4,y+sizey-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-1-(sizex/3),x+sizex/4,y+sizey-1-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-1-(sizex/3),x+(3*sizex)/4,y+sizey-1-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + //roller + DrawRuller(ScrollBar); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Vertical Scroll Bar +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// animation of up button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_DrawPressedUpButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //up button + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizex,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,sizex-2,sizex-2,COLOR_FON); + //up arrow of up button + Draw(fin,TOOL_LINE,x+sizex/2,y+sizex/3,x+sizex/4,y+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizex/3,x+(3*sizex)/4,y+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+1+(sizex/3),x+sizex/4,y+1+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+1+(sizex/3),x+(3*sizex)/4,y+1+(2*sizex)/3,COLOR_ABSOLUTE_DARK); +} + +void ScrollBar_DrawReleasedUpButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //up button + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizex,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,sizex-2,sizex-2,COLOR_MIDDLE_LIGHT); + //up arrow of up button + Draw(fin,TOOL_LINE,x+sizex/2,y+sizex/3,x+sizex/4,y+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizex/3,x+(3*sizex)/4,y+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+1+(sizex/3),x+sizex/4,y+1+(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+1+(sizex/3),x+(3*sizex)/4,y+1+(2*sizex)/3,COLOR_ABSOLUTE_DARK); +} + +//////////////////////////////////////////////////////////////////////////////// +// animation of down button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_DrawPressedDownButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //down button + Draw(fin,TOOL_RECTANGLE,x,y+sizey-sizex,sizex,sizex,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+sizey-sizex+1,sizex-2,sizex-2,COLOR_FON); + //down arrow of down button + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-sizex/3,x+sizex/4,y+sizey-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-sizex/3,x+(3*sizex)/4,y+sizey-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-1-(sizex/3),x+sizex/4,y+sizey-1-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-1-(sizex/3),x+(3*sizex)/4,y+sizey-1-(2*sizex)/3,COLOR_ABSOLUTE_DARK); +} + +void ScrollBar_DrawReleasedDownButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //down button + Draw(fin,TOOL_RECTANGLE,x,y+sizey-sizex,sizex,sizex,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+sizey-sizex+1,sizex-2,sizex-2,COLOR_MIDDLE_LIGHT); + //down arrow of down button + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-sizex/3,x+sizex/4,y+sizey-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-sizex/3,x+(3*sizex)/4,y+sizey-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-1-(sizex/3),x+sizex/4,y+sizey-1-(2*sizex)/3,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex/2,y+sizey-1-(sizex/3),x+(3*sizex)/4,y+sizey-1-(2*sizex)/3,COLOR_ABSOLUTE_DARK); +} + +//////////////////////////////////////////////////////////////////////////////// +// callback function for up button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_FuncCallbackForUpButton_Pressed(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + struct HEADERPARENT *main_parent; + + ScrollBar=(struct ControlScrollBar*)data; + if (ScrollBar->ruller_size!=1.0) + { + ScrollBar->ruller_pos=ScrollBar->ruller_pos-ScrollBar->ruller_step; + } + if (ScrollBar->ruller_pos<0.0) ScrollBar->ruller_pos=0.0; + ScrollBar_DrawPressedUpButton(ScrollBar); + + if (ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT)!=NULL) + { + main_parent=(struct HEADERPARENT*)ScrollBar->main_parent; + ScrollBar->flags=ScrollBar->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)ScrollBar; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT); + main_parent->number_callbacks++; + } + DrawRuller(ScrollBar); +} + +void ScrollBar_FuncCallbackForUpButton_Released(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + + ScrollBar=(struct ControlScrollBar*)data; + ScrollBar_DrawReleasedUpButton(ScrollBar); +} + +//////////////////////////////////////////////////////////////////////////////// +// callback function for down button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_FuncCallbackForDownButton_Pressed(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + struct HEADERPARENT *main_parent; + + ScrollBar=(struct ControlScrollBar*)data; + if (ScrollBar->ruller_size!=1.0) + { + ScrollBar->ruller_pos=ScrollBar->ruller_pos+ScrollBar->ruller_step; + } + if (ScrollBar->ruller_pos>1.0) ScrollBar->ruller_pos=1.0; + ScrollBar_DrawPressedDownButton(ScrollBar); + + if (ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT)!=NULL) + { + main_parent=(struct HEADERPARENT*)ScrollBar->main_parent; + ScrollBar->flags=ScrollBar->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)ScrollBar; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT); + main_parent->number_callbacks++; + } + DrawRuller(ScrollBar); +} + +void ScrollBar_FuncCallbackForDownButton_Released(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + + ScrollBar=(struct ControlScrollBar*)data; + ScrollBar_DrawReleasedDownButton(ScrollBar); + DrawRuller(ScrollBar); +} + +//////////////////////////////////////////////////////////////////////////////// +// Horizontal Scroll Bar +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// animation of left button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_DrawPressedLeftButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //left button + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,sizey-2,sizey-2,COLOR_FON); + //left arrow of left button + Draw(fin,TOOL_LINE,x+sizey/3,y+sizey/2,x+(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizey/3,y+sizey/2,x+(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+1+(sizey/3),y+sizey/2,x+1+(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+1+(sizey/3),y+sizey/2,x+1+(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); +} + +void ScrollBar_DrawReleasedLeftButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //left button + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,sizey-2,sizey-2,COLOR_MIDDLE_LIGHT); + //left arrow of left button + Draw(fin,TOOL_LINE,x+sizey/3,y+sizey/2,x+(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizey/3,y+sizey/2,x+(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+1+(sizey/3),y+sizey/2,x+1+(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+1+(sizey/3),y+sizey/2,x+1+(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); +} + +//////////////////////////////////////////////////////////////////////////////// +// animation of right button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_DrawPressedRightButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //right button + Draw(fin,TOOL_FILLED_RECTANGLE,x+sizex-sizey+1,y+1,sizey-2,sizey-2,COLOR_FON); + //right arrow of right button + Draw(fin,TOOL_LINE,x+sizex-sizey/3,y+sizey/2,x+sizex-(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-sizey/3,y+sizey/2,x+sizex-(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-1-(sizey/3),y+sizey/2,x+sizex-1-(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-1-(sizey/3),y+sizey/2,x+sizex-1-(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); +} + +void ScrollBar_DrawReleasedRightButton(struct ControlScrollBar *ScrollBar) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + fin=(struct FINITION*)ScrollBar->finition; + + //right button + Draw(fin,TOOL_FILLED_RECTANGLE,x+sizex-sizey+1,y+1,sizey-2,sizey-2,COLOR_MIDDLE_LIGHT); + //right arrow of right button + Draw(fin,TOOL_LINE,x+sizex-sizey/3,y+sizey/2,x+sizex-(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-sizey/3,y+sizey/2,x+sizex-(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-1-(sizey/3),y+sizey/2,x+sizex-1-(2*sizey)/3,y+sizey/4,COLOR_ABSOLUTE_DARK); + Draw(fin,TOOL_LINE,x+sizex-1-(sizey/3),y+sizey/2,x+sizex-1-(2*sizey)/3,y+(3*sizey)/4,COLOR_ABSOLUTE_DARK); +} +//////////////////////////////////////////////////////////////////////////////// +// callback function for left button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_FuncCallbackForLeftButton_Pressed(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + struct HEADERPARENT *main_parent; + + ScrollBar=(struct ControlScrollBar*)data; + if (ScrollBar->ruller_size!=1.0) + { + ScrollBar->ruller_pos=ScrollBar->ruller_pos-ScrollBar->ruller_step; + } + if (ScrollBar->ruller_pos<0.0) ScrollBar->ruller_pos=0.0; + ScrollBar_DrawPressedLeftButton(ScrollBar); + + if (ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT)!=NULL) + { + main_parent=(struct HEADERPARENT*)ScrollBar->main_parent; + ScrollBar->flags=ScrollBar->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)ScrollBar; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT); + main_parent->number_callbacks++; + } + DrawRuller(ScrollBar); +} + +void ScrollBar_FuncCallbackForLeftButton_Released(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + + ScrollBar=(struct ControlScrollBar*)data; + ScrollBar_DrawReleasedLeftButton(ScrollBar); +} + +//////////////////////////////////////////////////////////////////////////////// +// callback function for right button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_FuncCallbackForRightButton_Pressed(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + struct HEADERPARENT *main_parent; + + ScrollBar=(struct ControlScrollBar*)data; + if (ScrollBar->ruller_size!=1.0) + { + ScrollBar->ruller_pos=ScrollBar->ruller_pos+ScrollBar->ruller_step; + } + if (ScrollBar->ruller_pos>1.0) ScrollBar->ruller_pos=1.0; + ScrollBar_DrawPressedRightButton(ScrollBar); + + if (ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT)!=NULL) + { + main_parent=(struct HEADERPARENT*)ScrollBar->main_parent; + ScrollBar->flags=ScrollBar->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)ScrollBar; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT); + main_parent->number_callbacks++; + } + DrawRuller(ScrollBar); +} + +void ScrollBar_FuncCallbackForRightButton_Released(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + + ScrollBar=(struct ControlScrollBar*)data; + ScrollBar_DrawReleasedRightButton(ScrollBar); + DrawRuller(ScrollBar); +} + +//////////////////////////////////////////////////////////////////////////////// +// callback function for ruller bar button of Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void ScrollBar_FuncCallbackForScrollRullerPressed(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + + ScrollBar=(struct ControlScrollBar*)data; + ScrollBar->scb_flags=ScrollBar->scb_flags | FLAG_SCROLL_RULLER_PRESSED; +} + +void ScrollBar_FuncCallbackForScrollRullerReleased(struct HEADER *control,void *data) +{ + struct ControlScrollBar *ScrollBar; + + ScrollBar=(struct ControlScrollBar*)data; + ScrollBar->scb_flags=ScrollBar->scb_flags & FLAG_SCROLL_RULLER_RELEASED; +} + +//--------------------------------------------------------------------------------- +// control ScrollBar +//--------------------------------------------------------------------------------- +void ScrollBarProc(struct ControlScrollBar *ScrollBar,struct MESSAGE *message) +{ + int mx,my; + char mouse_buttons_state; + int x,y,sizex,sizey; + int scrollbar_size,ruller_size,ruller_pos; + int ruller_min,ruller_max; + float max_pos,current_pos,last_ruller_pos; + struct FINITION *fin; + struct TIMER *timer; + struct HEADERPARENT *main_parent; + + x=ScrollBar->ctrl_x; + y=ScrollBar->ctrl_y; + sizex=ScrollBar->ctrl_sizex; + sizey=ScrollBar->ctrl_sizey; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //draw ScrollBar + if (ScrollBar->flags & FLAG_SHOW_CONTROL) DrawScrollBar(ScrollBar); + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + fin=(struct FINITION*)ScrollBar->finition; + fin->flags=fin->flags | FINITION_ON; + fin->x=message->arg1; + fin->y=message->arg2; + fin->sizex=message->arg3; + fin->sizey=message->arg4; + DrawScrollBar(ScrollBar); + break; + } + case MESSAGE_SPECIALIZED: + { + if (ScrollBar->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON) + { + if (ScrollBar->flags & FLAG_SHOW_CONTROL) DrawScrollBar(ScrollBar); + ScrollBar->flags=ScrollBar->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF; + } + break; + } + case MESSAGE_MOUSE_EVENT: + { + mx=message->arg1; + my=message->arg2; + mouse_buttons_state=message->arg3; + main_parent=(struct HEADERPARENT*)ScrollBar->main_parent; + + //check ruller state + if (ScrollBar->scb_flags & FLAG_SCROLL_RULLER_PRESSED) + { // horizontal ScrollBar + if (ScrollBar->scb_flags & FLAG_SCROLL_BAR_ORIENTATION_HORIZONTAL_ON) + { + scrollbar_size=sizex-sizey*2; + ruller_size=scrollbar_size*ScrollBar->ruller_size; + if (ruller_size<5) ruller_size=5; + + ruller_min=x+sizey; //minimum x + ruller_max=ruller_min+scrollbar_size-ruller_size; + ruller_pos=mx-(ruller_size/2);//ruller centred under mouse pointer + + if (ruller_posruller_max) ruller_pos=ruller_max; + + if (ruller_max!=ruller_min) + { + max_pos=(float)(ruller_max-ruller_min); + current_pos=(float)(ruller_pos-ruller_min); + last_ruller_pos=ScrollBar->ruller_pos; + ScrollBar->ruller_pos=current_pos/max_pos; + } + else {ScrollBar->ruller_pos=0.0;} + + if (ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT)!=NULL) + { + if (ScrollBar->ruller_pos!=last_ruller_pos) + { + ScrollBar->flags=ScrollBar->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)ScrollBar; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT); + main_parent->number_callbacks++; + } + } + if (ScrollBar->ruller_pos!=last_ruller_pos) DrawRuller(ScrollBar); + break; + } + // vertical ScrollBar + if (ScrollBar->scb_flags & FLAG_SCROLL_BAR_ORIENTATION_VERTICAL_ON) + { + scrollbar_size=sizey-sizex*2; + ruller_size=scrollbar_size*ScrollBar->ruller_size; + if (ruller_size<5) ruller_size=5; + + ruller_min=y+sizex; //minimum x + ruller_max=ruller_min+scrollbar_size-ruller_size; + ruller_pos=my-(ruller_size/2);//ruller centred under mouse pointer + + if (ruller_posruller_max) ruller_pos=ruller_max; + + if (ruller_max!=ruller_min) + { + max_pos=(float)(ruller_max-ruller_min); + current_pos=(float)(ruller_pos-ruller_min); + last_ruller_pos=ScrollBar->ruller_pos; + ScrollBar->ruller_pos=current_pos/max_pos; + } + else {ScrollBar->ruller_pos=0.0;} + + if (ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT)!=NULL) + { + if (ScrollBar->ruller_pos!=last_ruller_pos) + { + ScrollBar->flags=ScrollBar->flags | FLAG_CONNECT_EVENT_ON; + main_parent->control_for_callback_function[main_parent->number_callbacks]= + (DWORD*)ScrollBar; + main_parent->callback_for_control_callback[main_parent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(ScrollBar,SCROLLBAR_CHANGED_EVENT); + main_parent->number_callbacks++; + } + } + if (ScrollBar->ruller_pos!=last_ruller_pos) DrawRuller(ScrollBar); + } + } + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + ScrollBar->ctrl_x=ScrollBar->ctrl_x+message->arg1; + ScrollBar->ctrl_y=ScrollBar->ctrl_y+message->arg2; + break; + } + case MESSAGE_CALL_TIMER_EVENT: + { + if (ScrollBar->timer!=(DWORD*)NULL) + { + timer=(struct TIMER*)ScrollBar->timer; + if (timer->flags & FLAG_TIMER_ON) Timer(timer); + } + break; + } + case MESSAGE_DESTROY_CONTROL: + { + if (ScrollBar->timer!=(DWORD*)NULL) free(ScrollBar->timer); + free(ScrollBar->finition); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + SendMessage((struct HEADER*)ScrollBar,message); + ScrollBar->main_parent=(DWORD*)message->arg1; + break; + } + + default: break; + } + //send message to child controls(if there is) + SendMessage((struct HEADER*)ScrollBar,message); +} + +//--------------------------------------------------------------------------------- +// create control ScrollBar +//--------------------------------------------------------------------------------- +void* CreateScrollBar(struct ScrollBarData *info_for_control) +{ + struct ControlScrollBar *ScrollBar; + struct FINITION *fin; + + ScrollBar=malloc(sizeof(struct ControlScrollBar)); + ScrollBar->finition=malloc(sizeof(struct FINITION)); + fin=(struct FINITION*)ScrollBar->finition; + fin->flags=0; + + ID++; +#ifdef DEBUG + printf("\ncreated scroll bar with ID=%d",(int)ID); +#endif + ScrollBar->child_bk=(DWORD*)NULL; + ScrollBar->child_fd=(DWORD*)NULL; + ScrollBar->active_control_for_keys=(DWORD*)NULL; + ScrollBar->active_control_for_mouse=(DWORD*)NULL; + ScrollBar->callback=(DWORD*)NULL; + ScrollBar->timer=(DWORD*)NULL; + + ScrollBar->ctrl_proc=(DWORD*)&ScrollBarProc; + ScrollBar->ctrl_x=(DWORD)info_for_control->x; + ScrollBar->ctrl_y=(DWORD)info_for_control->y; + ScrollBar->ctrl_sizex=(DWORD)info_for_control->width; + ScrollBar->ctrl_sizey=(DWORD)info_for_control->height; + ScrollBar->ctrl_ID=ID; + ScrollBar->ruller_size=info_for_control->ruller_size; + ScrollBar->ruller_pos=info_for_control->ruller_pos; + ScrollBar->ruller_step=info_for_control->ruller_step; + ScrollBar->flags=0; + ScrollBar->flags=ScrollBar->flags | FLAG_SHOW_CONTROL; + + return(ScrollBar); +} + +void* CreateHorizontalScrollBar(struct ScrollBarData *info_for_control) +{ + struct ControlScrollBar *ScrollBar; + struct ControlButton *ChildButton1; + struct ControlButton *ChildButton2; + struct ControlButton *ScrollRuller; + struct ButtonData ChildButton1Data; + struct ButtonData ChildButton2Data; + struct ButtonData ScrollRullerData; + + ScrollBar=CreateScrollBar(info_for_control); + //set horizontal orientation + ScrollBar->scb_flags=0; + ScrollBar->scb_flags=ScrollBar->scb_flags | FLAG_SCROLL_BAR_ORIENTATION_HORIZONTAL_ON; + + //fill data for first child button of scroller + ChildButton1Data.x=0; + ChildButton1Data.y=0; + ChildButton1Data.width=ScrollBar->ctrl_sizey; + ChildButton1Data.height=ChildButton1Data.width; + + //fill data for second child button of scroller + ChildButton2Data.x=ScrollBar->ctrl_sizex-ScrollBar->ctrl_sizey; + ChildButton2Data.y=0; + ChildButton2Data.width=ScrollBar->ctrl_sizey; + ChildButton2Data.height=ChildButton2Data.width; + + //fill data for scroll ruller button of scroller + ScrollRullerData.x=ScrollBar->ctrl_sizey; + ScrollRullerData.y=0; + ScrollRullerData.width=ScrollBar->ctrl_sizex-2*ScrollBar->ctrl_sizey; + ScrollRullerData.height=ScrollBar->ctrl_sizey; + + ChildButton1=CreateButton(&ChildButton1Data); + ChildButton2=CreateButton(&ChildButton2Data); + ScrollRuller=CreateButton(&ScrollRullerData); + + ChildButton1->flags=ChildButton1->flags & FLAG_HIDE_CONTROL; + ChildButton2->flags=ChildButton2->flags & FLAG_HIDE_CONTROL; + ScrollRuller->flags=ScrollRuller->flags & FLAG_HIDE_CONTROL; + + SetCallbackFunction(ChildButton1,BUTTON_PRESSED_EVENT,&ScrollBar_FuncCallbackForLeftButton_Pressed,ScrollBar); + SetCallbackFunction(ChildButton1,BUTTON_RELEASED_EVENT,&ScrollBar_FuncCallbackForLeftButton_Released,ScrollBar); + + SetCallbackFunction(ChildButton2,BUTTON_PRESSED_EVENT,&ScrollBar_FuncCallbackForRightButton_Pressed,ScrollBar); + SetCallbackFunction(ChildButton2,BUTTON_RELEASED_EVENT,&ScrollBar_FuncCallbackForRightButton_Released,ScrollBar); + + SetCallbackFunction(ScrollRuller,BUTTON_PRESSED_EVENT,&ScrollBar_FuncCallbackForScrollRullerPressed,ScrollBar); + SetCallbackFunction(ScrollRuller,BUTTON_RELEASED_EVENT,&ScrollBar_FuncCallbackForScrollRullerReleased,ScrollBar); + + //pack button in control ScrollBar + PackControls(ScrollBar,ChildButton1); + PackControls(ScrollBar,ChildButton2); + PackControls(ScrollBar,ScrollRuller); + + return(ScrollBar); +} + +void* CreateVerticalScrollBar(struct ScrollBarData *info_for_control) +{ + struct ControlScrollBar *ScrollBar; + struct ControlButton *ChildButton1; + struct ControlButton *ChildButton2; + struct ControlButton *ScrollRuller; + struct ButtonData ChildButton1Data; + struct ButtonData ChildButton2Data; + struct ButtonData ScrollRullerData; + + ScrollBar=CreateScrollBar(info_for_control); + //set vertical orientation + ScrollBar->scb_flags=0; + ScrollBar->scb_flags=ScrollBar->scb_flags | FLAG_SCROLL_BAR_ORIENTATION_VERTICAL_ON; + + //fill data for first child button of scroller + ChildButton1Data.x=0; + ChildButton1Data.y=0; + ChildButton1Data.width=ScrollBar->ctrl_sizex; + ChildButton1Data.height=ChildButton1Data.width; + + //fill data for second child button of scroller + ChildButton2Data.x=0; + ChildButton2Data.y=ScrollBar->ctrl_sizey-ScrollBar->ctrl_sizex; + ChildButton2Data.width=ScrollBar->ctrl_sizex; + ChildButton2Data.height=ChildButton2Data.width; + + //fill data for scroll ruller button of scroller + ScrollRullerData.x=0; + ScrollRullerData.y=ScrollBar->ctrl_sizex; + ScrollRullerData.width=ScrollBar->ctrl_sizex; + ScrollRullerData.height=ScrollBar->ctrl_sizey-2*ScrollBar->ctrl_sizex; + + ChildButton1=CreateButton(&ChildButton1Data); + ChildButton2=CreateButton(&ChildButton2Data); + ScrollRuller=CreateButton(&ScrollRullerData); + + ChildButton1->flags=ChildButton1->flags & FLAG_HIDE_CONTROL; + ChildButton2->flags=ChildButton2->flags & FLAG_HIDE_CONTROL; + ScrollRuller->flags=ScrollRuller->flags & FLAG_HIDE_CONTROL; + + SetCallbackFunction(ChildButton1,BUTTON_PRESSED_EVENT,&ScrollBar_FuncCallbackForUpButton_Pressed,ScrollBar); + SetCallbackFunction(ChildButton1,BUTTON_RELEASED_EVENT,&ScrollBar_FuncCallbackForUpButton_Released,ScrollBar); + + SetCallbackFunction(ChildButton2,BUTTON_PRESSED_EVENT,&ScrollBar_FuncCallbackForDownButton_Pressed,ScrollBar); + SetCallbackFunction(ChildButton2,BUTTON_RELEASED_EVENT,&ScrollBar_FuncCallbackForDownButton_Released,ScrollBar); + + SetCallbackFunction(ScrollRuller,BUTTON_PRESSED_EVENT,&ScrollBar_FuncCallbackForScrollRullerPressed,ScrollBar); + SetCallbackFunction(ScrollRuller,BUTTON_RELEASED_EVENT,&ScrollBar_FuncCallbackForScrollRullerReleased,ScrollBar); + + //pack button in control ScrollBar + PackControls(ScrollBar,ChildButton1); + PackControls(ScrollBar,ChildButton2); + PackControls(ScrollBar,ScrollRuller); + + return(ScrollBar); +} + diff --git a/programs/develop/new libGUI_C/SRC/control_scrolled_window.h b/programs/develop/new libGUI_C/SRC/control_scrolled_window.h new file mode 100755 index 0000000000..b7581ac60a --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_scrolled_window.h @@ -0,0 +1,6 @@ +#define FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON 0x1 +#define FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON 0x2 + +#define FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_OFF 0xfe +#define FLAG_SCROLL_WIN_VERTICAL_SCROLL_OFF 0xfd + diff --git a/programs/develop/new libGUI_C/SRC/control_scrolled_window.inc b/programs/develop/new libGUI_C/SRC/control_scrolled_window.inc new file mode 100755 index 0000000000..9290d69c56 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_scrolled_window.inc @@ -0,0 +1,609 @@ +/* + control ScrolledWindow +*/ + + +//////////////////////////////////////////////////////////////////////// +// pack controls in ScrolledWindow +//////////////////////////////////////////////////////////////////////// +void ScrolledWindowPackControls(void *parent,void *Control) +{ + struct HEADER *control; + struct ControlScrolledWindow *ScrolledWindow; + struct ControlScrollBar *HorizontalScrollBar; + struct ControlScrollBar *VerticalScrollBar; + struct FINITION *fin; + int x,y; + + ScrolledWindow=(struct ControlScrolledWindow*)parent; + control=(struct HEADER *)Control; + + if (control->ctrl_x+control->ctrl_sizex>ScrolledWindow->virtual_sizex) + { + ScrolledWindow->virtual_sizex=control->ctrl_x+control->ctrl_sizex; + } + if (control->ctrl_y+control->ctrl_sizey>ScrolledWindow->virtual_sizey) + { + ScrolledWindow->virtual_sizey=control->ctrl_y+control->ctrl_sizey; + } + + PackControls(ScrolledWindow,control); + + //calculate new control coordinates + x=control->ctrl_x+1;//add border width + y=control->ctrl_y+1;//add border heght + SetControlNewPosition(control,x,y); + + //save coordinates of control in arrea + ScrolledWindow->virtual_controls_x[ScrolledWindow->number_virtual_controls]=x; + ScrolledWindow->virtual_controls_y[ScrolledWindow->number_virtual_controls]=y; + ScrolledWindow->number_virtual_controls++; + + x=ScrolledWindow->ctrl_x+1; + y=ScrolledWindow->ctrl_y+1; + + //check cross control with scroll arrea + if (CheckCrossRectangles(x,y,ScrolledWindow->scroll_arrea_sizex,ScrolledWindow->scroll_arrea_sizey, + control->ctrl_x,control->ctrl_y,control->ctrl_sizex,control->ctrl_sizey)==TRUE) + { + control->flags=control->flags | FLAG_SHOW_CONTROL; + control->flags=control->flags & FLAG_MOUSE_BLOCKED_OFF; + } + else + { + control->flags=control->flags & FLAG_HIDE_CONTROL; + control->flags=control->flags | FLAG_MOUSE_BLOCKED_ON; + } + + if (ScrolledWindow->virtual_sizex>ScrolledWindow->scroll_arrea_sizex) + { + HorizontalScrollBar=(struct ControlScrollBar*)ScrolledWindow->horizontal_scroll; + + if ((ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON)==FALSE) + { + ScrolledWindow->scroll_arrea_sizey=ScrolledWindow->ctrl_sizey-16-2; + ScrolledWindow->scw_flags=ScrolledWindow->scw_flags | FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON; + HorizontalScrollBar->flags=HorizontalScrollBar->flags | FLAG_SHOW_CONTROL; + HorizontalScrollBar->flags=HorizontalScrollBar->flags & FLAG_MOUSE_BLOCKED_OFF; + } + } + + if (ScrolledWindow->virtual_sizey>ScrolledWindow->scroll_arrea_sizey) + { + VerticalScrollBar=(struct ControlScrollBar*)ScrolledWindow->vertical_scroll; + + if ((ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON)==FALSE) + { + ScrolledWindow->scroll_arrea_sizex=ScrolledWindow->ctrl_sizex-16-2; + ScrolledWindow->scw_flags=ScrolledWindow->scw_flags | FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON; + VerticalScrollBar->flags=VerticalScrollBar->flags | FLAG_SHOW_CONTROL; + VerticalScrollBar->flags=VerticalScrollBar->flags & FLAG_MOUSE_BLOCKED_OFF; + } + } + + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON) + { + HorizontalScrollBar->ruller_size=(float)ScrolledWindow->scroll_arrea_sizex; + HorizontalScrollBar->ruller_size=HorizontalScrollBar->ruller_size/((float)ScrolledWindow->virtual_sizex); + } + + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON) + { + VerticalScrollBar->ruller_size=(float)ScrolledWindow->scroll_arrea_sizey; + VerticalScrollBar->ruller_size=VerticalScrollBar->ruller_size/((float)ScrolledWindow->virtual_sizey); + } + + //finit draw arrea for control + fin=(struct FINITION*)control->finition; + fin->x=ScrolledWindow->ctrl_x+1; + fin->y=ScrolledWindow->ctrl_y+1; + fin->sizex=ScrolledWindow->scroll_arrea_sizex; + fin->sizey=ScrolledWindow->scroll_arrea_sizey; + fin->flags=fin->flags | FINITION_ON; + +} +//////////////////////////////////////////////////////////////////////////////// +// Draw full Scroll Bar +//////////////////////////////////////////////////////////////////////////////// +void DrawScrolledWindow(struct ControlScrolledWindow *ScrolledWindow) +{ + int x,y,sizex,sizey; + struct FINITION *fin; + + x=ScrolledWindow->ctrl_x; + y=ScrolledWindow->ctrl_y; + sizex=ScrolledWindow->ctrl_sizex; + sizey=ScrolledWindow->ctrl_sizey; + fin=(struct FINITION*)ScrolledWindow->finition; + + Draw(fin,TOOL_FILLED_RECTANGLE,x+1,y+1,ScrolledWindow->scroll_arrea_sizex, + ScrolledWindow->scroll_arrea_sizey,COLOR_LIGHT); + + if ((ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON) || + (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON)) + { + Draw(fin,TOOL_RECTANGLE,x,y,ScrolledWindow->scroll_arrea_sizex+2, + ScrolledWindow->scroll_arrea_sizey+2,0xff0000); + } + else + Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK); +} + +void ScrollWin_FuncCallback_HScroll(struct HEADER* control,void *data) +{ + struct ControlScrollBar *Hscrollbar,*Vscrollbar; + struct ControlScrolledWindow *ScrolledWindow; + struct HEADER *seek_control,*exchange_control; + struct FINITION *fin; + struct MESSAGE local_message; + int i,new_x,new_y,x,y,sizex,sizey; + + Hscrollbar=(struct ControlScrollBar*)control; + ScrolledWindow=(struct ControlScrolledWindow*)data; + + ScrolledWindow->virtual_x=(ScrolledWindow->virtual_sizex-ScrolledWindow->scroll_arrea_sizex)*Hscrollbar->ruller_pos; + + x=ScrolledWindow->ctrl_x+1; + y=ScrolledWindow->ctrl_y+1; + sizex=ScrolledWindow->scroll_arrea_sizex; + sizey=ScrolledWindow->scroll_arrea_sizey; + + local_message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + local_message.arg1=x; + local_message.arg2=y; + local_message.arg3=sizex; + local_message.arg4=sizey; + + fin=(finition_t*)ScrolledWindow->finition; + Draw(fin,TOOL_FILLED_RECTANGLE,x,y,sizex,sizey,COLOR_LIGHT); + + Vscrollbar=(struct ControlScrollBar*)ScrolledWindow->vertical_scroll; + seek_control=(struct HEADER*)Vscrollbar->ctrl_fd; + //move controls in new position + for(i=0;inumber_virtual_controls;i++) + { + new_x=ScrolledWindow->virtual_controls_x[i]-ScrolledWindow->virtual_x; + new_y=ScrolledWindow->virtual_controls_y[i]-ScrolledWindow->virtual_y; + + SetControlNewPosition(seek_control,new_x,new_y); + + if (CheckCrossRectangles(local_message.arg1,local_message.arg2,local_message.arg3,local_message.arg4, + seek_control->ctrl_x,seek_control->ctrl_y,seek_control->ctrl_sizex,seek_control->ctrl_sizey)==TRUE) + { + seek_control->flags=seek_control->flags | FLAG_SHOW_CONTROL; + seek_control->flags=seek_control->flags & FLAG_MOUSE_BLOCKED_OFF; + } + else + { + seek_control->flags=seek_control->flags & FLAG_HIDE_CONTROL; + seek_control->flags=seek_control->flags | FLAG_MOUSE_BLOCKED_ON; + } + + if (seek_control->flags & FLAG_SHOW_CONTROL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,&local_message); + } + + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } +} + +void ScrollWin_FuncCallback_VScroll(struct HEADER* control,void *data) +{ + struct ControlScrollBar *Hscrollbar,*Vscrollbar; + struct ControlScrolledWindow *ScrolledWindow; + struct HEADER *seek_control,*exchange_control; + struct MESSAGE local_message; + struct FINITION *fin; + int i,new_x,new_y,x,y,sizex,sizey; + + Vscrollbar=(struct ControlScrollBar*)control; + ScrolledWindow=(struct ControlScrolledWindow*)data; + + ScrolledWindow->virtual_y=(ScrolledWindow->virtual_sizey-ScrolledWindow->scroll_arrea_sizey)*Vscrollbar->ruller_pos; + + x=ScrolledWindow->ctrl_x+1; + y=ScrolledWindow->ctrl_y+1; + sizex=ScrolledWindow->scroll_arrea_sizex; + sizey=ScrolledWindow->scroll_arrea_sizey; + + local_message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + local_message.arg1=x; + local_message.arg2=y; + local_message.arg3=sizex; + local_message.arg4=sizey; + + fin=(finition_t*)ScrolledWindow->finition; + Draw(fin,TOOL_FILLED_RECTANGLE,x,y,sizex,sizey,COLOR_LIGHT); + + seek_control=(struct HEADER*)Vscrollbar->ctrl_fd; + //move controls in new position + for(i=0;inumber_virtual_controls;i++) + { + new_x=ScrolledWindow->virtual_controls_x[i]-ScrolledWindow->virtual_x; + new_y=ScrolledWindow->virtual_controls_y[i]-ScrolledWindow->virtual_y; + + SetControlNewPosition(seek_control,new_x,new_y); + + if (CheckCrossRectangles(local_message.arg1,local_message.arg2,local_message.arg3,local_message.arg4, + seek_control->ctrl_x,seek_control->ctrl_y,seek_control->ctrl_sizex,seek_control->ctrl_sizey)==TRUE) + { + seek_control->flags=seek_control->flags | FLAG_SHOW_CONTROL; + seek_control->flags=seek_control->flags & FLAG_MOUSE_BLOCKED_OFF; + } + else + { + seek_control->flags=seek_control->flags & FLAG_HIDE_CONTROL; + seek_control->flags=seek_control->flags | FLAG_MOUSE_BLOCKED_ON; + } + + if (seek_control->flags & FLAG_SHOW_CONTROL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,&local_message); + } + + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } +} + +void ScrlWinCheckActivatedForKeysControl(struct ControlScrolledWindow *ScrolledWindow) +{ + struct HEADER *control,*seek_control,*exchange_control; + struct MESSAGE local_message; + struct FINITION *fin; + struct ControlScrollBar *Vscrollbar,*Hscrollbar; + int i,x,y,sizex,sizey; + int sx,sy; + + control=(struct HEADER*)ScrolledWindow->active_control_for_keys; + + x=ScrolledWindow->ctrl_x+1; + y=ScrolledWindow->ctrl_y+1; + sizex=ScrolledWindow->scroll_arrea_sizex; + sizey=ScrolledWindow->scroll_arrea_sizey; + + if (CheckFullCrossRectangles(x,y,sizex,sizey, + control->ctrl_x,control->ctrl_y,control->ctrl_sizex,control->ctrl_sizey)==TRUE) return; + + //calculate new x and y coordinates + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON) + { + sx=(control->ctrl_x-x); + + if (sx<0) sx=x; + else + { + if (control->ctrl_sizexctrl_sizex; + else sx=x; + } + } + + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON) + { + sy=(control->ctrl_y-y); + + if (sy<0) sy=y; + else + { + if (control->ctrl_sizeyctrl_sizey; + else sy=y; + } + } + + Vscrollbar=(struct ControlScrollBar*)ScrolledWindow->vertical_scroll; + Hscrollbar=(struct ControlScrollBar*)ScrolledWindow->horizontal_scroll; + //find active control and virtual control coordinates + seek_control=(struct HEADER*)Vscrollbar->ctrl_fd; + + for(i=0;inumber_virtual_controls;i++) + { + if (seek_control==control) + { + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON) + ScrolledWindow->virtual_x=ScrolledWindow->virtual_controls_x[i]-sx; + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON) + ScrolledWindow->virtual_y=ScrolledWindow->virtual_controls_y[i]-sy; + break; + } + + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } + + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_HORIZONTAL_SCROLL_ON) + { + Hscrollbar->ruller_pos=(float)ScrolledWindow->virtual_x; + Hscrollbar->ruller_pos=Hscrollbar->ruller_pos/((float)(ScrolledWindow->virtual_sizex-ScrolledWindow->scroll_arrea_sizex)); + SpecialRedrawControl(Hscrollbar); + } + if (ScrolledWindow->scw_flags & FLAG_SCROLL_WIN_VERTICAL_SCROLL_ON) + { + Vscrollbar->ruller_pos=(float)ScrolledWindow->virtual_y; + Vscrollbar->ruller_pos=Vscrollbar->ruller_pos/((float)(ScrolledWindow->virtual_sizey-ScrolledWindow->scroll_arrea_sizey)); + SpecialRedrawControl(Vscrollbar); + } + + local_message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + local_message.arg1=x; + local_message.arg2=y; + local_message.arg3=sizex; + local_message.arg4=sizey; + + fin=(finition_t*)ScrolledWindow->finition; + Draw(fin,TOOL_FILLED_RECTANGLE,x,y,sizex,sizey,COLOR_LIGHT); + + seek_control=(struct HEADER*)Vscrollbar->ctrl_fd; + //move controls in new position + for(i=0;inumber_virtual_controls;i++) + { + sx=ScrolledWindow->virtual_controls_x[i]-ScrolledWindow->virtual_x; + sy=ScrolledWindow->virtual_controls_y[i]-ScrolledWindow->virtual_y; + + SetControlNewPosition(seek_control,sx,sy); + + if (CheckCrossRectangles(x,y,sizex,sizey,seek_control->ctrl_x,seek_control->ctrl_y, + seek_control->ctrl_sizex,seek_control->ctrl_sizey)==TRUE) + { + seek_control->flags=seek_control->flags | FLAG_SHOW_CONTROL; + seek_control->flags=seek_control->flags & FLAG_MOUSE_BLOCKED_OFF; + } + else + { + seek_control->flags=seek_control->flags & FLAG_HIDE_CONTROL; + seek_control->flags=seek_control->flags | FLAG_MOUSE_BLOCKED_ON; + } + + if (seek_control->flags & FLAG_SHOW_CONTROL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,&local_message); + } + + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } +} + +//--------------------------------------------------------------------------------- +// control ScrolledWindowScrolledWindow->virtual_sizex +//--------------------------------------------------------------------------------- +void ScrolledWindowProc(struct ControlScrolledWindow *ScrolledWindow,struct MESSAGE *message) +{ + int i,x,y,sizex,sizey; + struct HEADER *seek_control,*exchange_control; + struct ControlScrollBar *Hscrollbar,*Vscrollbar; + struct MESSAGE local_message; + struct FINITION *fin; + struct TIMER *timer; + + x=ScrolledWindow->ctrl_x; + y=ScrolledWindow->ctrl_y; + sizex=ScrolledWindow->ctrl_sizex; + sizey=ScrolledWindow->ctrl_sizey; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //draw ScrolledWindow + if (ScrolledWindow->flags & FLAG_SHOW_CONTROL) + { + DrawScrolledWindow(ScrolledWindow); + + //send message to scroll bars + Hscrollbar=(struct ControlScrollBar*)ScrolledWindow->horizontal_scroll; + Vscrollbar=(struct ControlScrollBar*)ScrolledWindow->vertical_scroll; + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))Hscrollbar->ctrl_proc; + ControlProc((struct HEADER*)Hscrollbar,message); + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))Vscrollbar->ctrl_proc; + ControlProc((struct HEADER*)Vscrollbar,message); + + //send message finit redraw only to some child controls of ScrolledWondow + local_message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION; + local_message.arg1=ScrolledWindow->ctrl_x+1; + local_message.arg2=ScrolledWindow->ctrl_y+1; + local_message.arg3=ScrolledWindow->scroll_arrea_sizex; + local_message.arg4=ScrolledWindow->scroll_arrea_sizey; + + seek_control=(struct HEADER *)Vscrollbar->ctrl_fd; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_SHOW_CONTROL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,&local_message); + } + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } + } + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + fin=(struct FINITION*)ScrolledWindow->finition; + fin->flags=fin->flags | FINITION_ON; + fin->x=message->arg1; + fin->y=message->arg2; + fin->sizex=message->arg3; + fin->sizey=message->arg4; + DrawScrolledWindow(ScrolledWindow); + SendMessage((struct HEADER*)ScrolledWindow,message);//<<<<<<---------------------------------- + break; + } + case MESSAGE_SPECIALIZED: + { + if (ScrolledWindow->flags & FLAG_SHOW_CONTROL) SendMessage((struct HEADER*)ScrolledWindow,message); + ScrolledWindow->flags=ScrolledWindow->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF; + break; + } + + case MESSAGE_KEYS_EVENT: + { + if (ScrolledWindow->active_control_for_keys!=NULL) ScrlWinCheckActivatedForKeysControl(ScrolledWindow); + SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_MOUSE_EVENT: + { + SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + ScrolledWindow->ctrl_x=ScrolledWindow->ctrl_x+message->arg1; + ScrolledWindow->ctrl_y=ScrolledWindow->ctrl_y+message->arg2; + + //change virtual coordinates of controls + Vscrollbar=(struct ControlScrollBar*)ScrolledWindow->vertical_scroll; + seek_control=(struct HEADER *)Vscrollbar->ctrl_fd; + for(i=0;inumber_virtual_controls;i++) + { + ScrolledWindow->virtual_controls_x[i]+=message->arg1; + ScrolledWindow->virtual_controls_y[i]+=message->arg2; + + fin=(struct FINITION*)seek_control->finition; + fin->x=ScrolledWindow->ctrl_x+1; + fin->y=ScrolledWindow->ctrl_y+1; + fin->sizex=ScrolledWindow->scroll_arrea_sizex; + fin->sizey=ScrolledWindow->scroll_arrea_sizey; + + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } + + SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_CALL_TIMER_EVENT: + { + if (ScrolledWindow->timer!=(DWORD*)NULL) + { + timer=(struct TIMER*)ScrolledWindow->timer; + if (timer->flags & FLAG_TIMER_ON) Timer(timer); + } + SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_SET_FOCUSE: + { + //SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_CHANGE_FOCUSE: + { + //SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_DESTROY_CONTROL: + { + if (ScrolledWindow->timer!=(DWORD*)NULL) free(ScrolledWindow->timer); + free(ScrolledWindow->finition); + SendMessage((struct HEADER*)ScrolledWindow,message); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + SendMessage((struct HEADER*)ScrolledWindow,message); + ScrolledWindow->main_parent=(DWORD*)message->arg1; + break; + } + + default: break; + } +} + +//--------------------------------------------------------------------------------- +// create control ScrolledWindow +//--------------------------------------------------------------------------------- +void* CreateScrolledWindow(struct ScrolledWindowData *info_for_control) +{ + struct ControlScrolledWindow *ScrolledWindow; + struct FINITION *fin; + struct ControlScrollBar *HorizontalScrollBar; + struct ControlScrollBar *VerticalScrollBar; + struct ScrollBarData HorizontalScrollData; + struct ScrollBarData VerticalScrollData; + + + ScrolledWindow=malloc(sizeof(struct ControlScrolledWindow)); + ScrolledWindow->finition=malloc(sizeof(struct FINITION)); + fin=(struct FINITION*)ScrolledWindow->finition; + fin->flags=0; + ScrolledWindow->scw_flags=0; + + ID++; +#ifdef DEBUG + printf("\ncreated scrollet window with ID=%d",(int)ID); +#endif + ScrolledWindow->child_bk=(DWORD*)NULL; + ScrolledWindow->child_fd=(DWORD*)NULL; + ScrolledWindow->active_control_for_keys=(DWORD*)NULL; + ScrolledWindow->active_control_for_mouse=(DWORD*)NULL; + ScrolledWindow->callback=(DWORD*)NULL; + ScrolledWindow->timer=(DWORD*)NULL; + + ScrolledWindow->ctrl_proc=(DWORD*)&ScrolledWindowProc; + ScrolledWindow->ctrl_x=(DWORD)info_for_control->x; + ScrolledWindow->ctrl_y=(DWORD)info_for_control->y; + ScrolledWindow->ctrl_sizex=(DWORD)info_for_control->width; + ScrolledWindow->ctrl_sizey=(DWORD)info_for_control->height; + ScrolledWindow->ctrl_ID=ID; + ScrolledWindow->virtual_x=0; + ScrolledWindow->virtual_y=0; + ScrolledWindow->virtual_controls_x=malloc(1024*sizeof(DWORD)); + ScrolledWindow->virtual_controls_y=malloc(1024*sizeof(DWORD)); + ScrolledWindow->virtual_sizex=0; + ScrolledWindow->virtual_sizey=0; + ScrolledWindow->number_virtual_controls=0; + ScrolledWindow->flags=0; + ScrolledWindow->flags=ScrolledWindow->flags | FLAG_SHOW_CONTROL; + ScrolledWindow->flags=ScrolledWindow->flags | FLAG_FOCUSE_INPUT_SUPPOROTE; + + //calculate default scroll arrea size + ScrolledWindow->scroll_arrea_sizex=ScrolledWindow->ctrl_sizex-2; + ScrolledWindow->scroll_arrea_sizey=ScrolledWindow->ctrl_sizey-2; + + //create child scroll bars + HorizontalScrollData.x=0; + HorizontalScrollData.y=ScrolledWindow->ctrl_sizey-16; + HorizontalScrollData.width=ScrolledWindow->ctrl_sizex-16; + HorizontalScrollData.height=16; + HorizontalScrollData.ruller_size=1.0; + HorizontalScrollData.ruller_pos=0.0; + HorizontalScrollData.ruller_step=0.05; + + VerticalScrollData.x=ScrolledWindow->ctrl_sizex-16; + VerticalScrollData.y=0; + VerticalScrollData.width=16; + VerticalScrollData.height=ScrolledWindow->ctrl_sizey-16; + VerticalScrollData.ruller_size=1.0; + VerticalScrollData.ruller_pos=0.0; + VerticalScrollData.ruller_step=0.05; + + HorizontalScrollBar=CreateHorizontalScrollBar(&HorizontalScrollData); + VerticalScrollBar=CreateVerticalScrollBar(&VerticalScrollData); + + SetCallbackFunction(HorizontalScrollBar,SCROLLBAR_CHANGED_EVENT,&ScrollWin_FuncCallback_HScroll,ScrolledWindow); + SetCallbackFunction(VerticalScrollBar,SCROLLBAR_CHANGED_EVENT,&ScrollWin_FuncCallback_VScroll,ScrolledWindow); + + PackControls(ScrolledWindow,HorizontalScrollBar); + PackControls(ScrolledWindow,VerticalScrollBar); + + ScrolledWindow->horizontal_scroll=(DWORD*)HorizontalScrollBar; + ScrolledWindow->vertical_scroll=(DWORD*)VerticalScrollBar; + //disable show scrollers and block mouse for them + HorizontalScrollBar->flags=HorizontalScrollBar->flags & FLAG_HIDE_CONTROL; + HorizontalScrollBar->flags=HorizontalScrollBar->flags | FLAG_MOUSE_BLOCKED_ON; + VerticalScrollBar->flags=VerticalScrollBar->flags & FLAG_HIDE_CONTROL; + VerticalScrollBar->flags=VerticalScrollBar->flags | FLAG_MOUSE_BLOCKED_ON; + + return(ScrolledWindow); +} + diff --git a/programs/develop/new libGUI_C/SRC/control_text.h b/programs/develop/new libGUI_C/SRC/control_text.h new file mode 100755 index 0000000000..c38be2dd25 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_text.h @@ -0,0 +1,16 @@ + +#define TEXT_ORIENTATION_FROM_LEFT_TO_RIGHT_ON 0x1 +#define TEXT_ORIENTATION_FROM_LEFT_TO_RIGHT_OFF 0xfe + +#define TEXT_BACKGROUND_ON 0x2; +#define TEXT_BACKGROUND_OFF 0xfd; + +struct TextSize +{ + int sizex; + int sizey; +}; + +typedef struct TextSize gui_text_size_t; + + diff --git a/programs/develop/new libGUI_C/SRC/control_text.inc b/programs/develop/new libGUI_C/SRC/control_text.inc new file mode 100755 index 0000000000..f97b62aec7 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/control_text.inc @@ -0,0 +1,181 @@ +/* + control Text +*/ + + +gui_text_size_t GetStringSize(font_t *font,char *s) +{ + long len; + gui_text_size_t size; + + len=strlen(s); + if (font->size==FONT_CONSTANT_SIZE) + { + if (font->flags & FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON) + { + size.sizex=len*font->sizex; + size.sizey=font->sizey; + } + } + + return(size); +} + +void TextBackgroundOn(gui_text_t *Text) +{ + Text->txt_flags |=TEXT_BACKGROUND_ON; +} + +void TextBackgroundOff(gui_text_t *Text) +{ + Text->txt_flags &=TEXT_BACKGROUND_ON; +} + +void DisplayText(gui_text_t *Text) +{ + int x; + int y; + int sizex; + int sizey; + char v; + font_t *font; + gui_text_size_t size; + struct FINITION *fin; + + x=Text->ctrl_x; + y=Text->ctrl_y; + fin=(struct FINITION*)Text->finition; + font=(font_t*)Text->font; + + v=Text->txt_flags & TEXT_BACKGROUND_ON; + if (v) font->flags|=FONT_FLAG_DRAW_BACKGROUND_ON; + else font->flags&=FONT_FLAG_DRAW_BACKGROUND_OFF; + + v=Text->txt_flags & TEXT_ORIENTATION_FROM_LEFT_TO_RIGHT_ON; + if (v) font->flags|=FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON; + else font->flags&=FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_OFF; + + size=GetStringSize((font_t*)Text->font,Text->text); + Text->ctrl_sizex=(DWORD)size.sizex; + Text->ctrl_sizey=(DWORD)size.sizey; + + DrawFont=(void(*)(finition_t *fin,int fx,int fy,DWORD color, + DWORD background_color,font_t *font,BYTE *s))font->fnt_draw; + DrawFont(fin,x,y,Text->color,Text->background_color,font,Text->text); +} + +//--------------------------------------------------------------------------------- +// control Text +//--------------------------------------------------------------------------------- +void TextProc(gui_text_t *Text,gui_message_t *message) +{ + finition_t *fin; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //draw Text + if (Text->flags & FLAG_SHOW_CONTROL) DisplayText(Text); + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + fin=(struct FINITION*)Text->finition; + fin->flags=fin->flags | FINITION_ON; + fin->x=message->arg1; + fin->y=message->arg2; + fin->sizex=message->arg3; + fin->sizey=message->arg4; + DisplayText(Text); + break; + } + case MESSAGE_SPECIALIZED: + { + if (Text->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON) + { + if (Text->flags & FLAG_SHOW_CONTROL) DisplayText(Text); + Text->flags=Text->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF; + } + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + Text->ctrl_x=Text->ctrl_x+message->arg1; + Text->ctrl_y=Text->ctrl_y+message->arg2; + break; + } + case MESSAGE_DESTROY_CONTROL: + { + free(Text->finition); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + SendMessage((struct HEADER*)Text,message); + Text->main_parent=(DWORD*)message->arg1; + break; + } + + default: break; + } + //send message to child controls(if there is) + SendMessage((struct HEADER*)Text,message); +} + +//--------------------------------------------------------------------------------- +// create control Text +//--------------------------------------------------------------------------------- +void* CreateText(gui_text_data_t *info_for_control) +{ + gui_text_t *Text; + finition_t *fin; + gui_text_size_t size; + + Text=malloc(sizeof(struct ControlText)); + Text->finition=malloc(sizeof(struct FINITION)); + fin=(struct FINITION*)Text->finition; + fin->flags=0; + + if (info_for_control->font==(DWORD*)NULL) Text->font=FontsMeneger.default_font; + else Text->font=info_for_control->font; + + size=GetStringSize((font_t*)Text->font,info_for_control->text); + + ID++; +#ifdef DEBUG + printf("\ncreated text with ID=%d",(int)ID); +#endif + Text->child_bk=(DWORD*)NULL; + Text->child_fd=(DWORD*)NULL; + Text->active_control_for_keys=(DWORD*)NULL; + Text->active_control_for_mouse=(DWORD*)NULL; + Text->callback=(DWORD*)NULL; + Text->timer=(DWORD*)NULL; + + Text->ctrl_proc=(DWORD*)&TextProc; + Text->ctrl_x=(DWORD)info_for_control->x; + Text->ctrl_y=(DWORD)info_for_control->y; + Text->ctrl_sizex=(DWORD)size.sizex; + Text->ctrl_sizey=(DWORD)size.sizey; + Text->ctrl_ID=ID; + Text->color=info_for_control->color; + Text->background_color=info_for_control->background_color; + Text->text=info_for_control->text; + Text->txt_flags=0; + Text->txt_flags|=TEXT_ORIENTATION_FROM_LEFT_TO_RIGHT_ON; + + if (info_for_control->background) + { + Text->txt_flags|=TEXT_BACKGROUND_ON; + } + else + { + Text->txt_flags&=TEXT_BACKGROUND_OFF; + } + + Text->flags=0; + Text->flags=Text->flags | FLAG_SHOW_CONTROL; + + return(Text); +} diff --git a/programs/develop/new libGUI_C/SRC/draw_controls.h b/programs/develop/new libGUI_C/SRC/draw_controls.h new file mode 100755 index 0000000000..ac5c2ff547 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/draw_controls.h @@ -0,0 +1,31 @@ + +#define FINITION_ON 0x1 +#define FINITION_OFF 0xfe + +#define COLOR_FON 0x924900 +#define COLOR_DARK 0x5a5a5a +#define COLOR_ABSOLUTE_DARK 0x0 +#define COLOR_MIDDLE_LIGHT 0xffff00 +#define COLOR_LIGHT 0xffffff + +#define COLOR_INSERT 0x71ff30//0xffff10 + +///////////////////////////////////////////////////////////////////////////////////////// +// tool's names +///////////////////////////////////////////////////////////////////////////////////////// +#define TOOL_PIXEL 128 +#define TOOL_LINE 129 +#define TOOL_VERTICAL_LINE 130 +#define TOOL_HORIZONTAL_LINE 131 +#define TOOL_RECTANGLE 132 +#define TOOL_FILLED_RECTANGLE 133 +#define TOOL_GRADIENT_UP_FILLED_RECTANGLE 134 +#define TOOL_GRADIENT_DOWN_FILLED_RECTANGLE 135 +#define TOOL_GRADIENT_LEFT_FILLED_RECTANGLE 136 +#define TOOL_GRADIENT_RIGHT_FILLED_RECTANGLE 137 +#define TOOL_CIRCLE 138 +#define TOOL_FILLED_CIRCLE 139 +#define TOOL_ELLIPSE 140 +#define TOOL_FILLED_ELLIPSE 141 +#define TOOL_IMAGE 142 + diff --git a/programs/develop/new libGUI_C/SRC/draw_controls.inc b/programs/develop/new libGUI_C/SRC/draw_controls.inc new file mode 100755 index 0000000000..95aec233c3 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/draw_controls.inc @@ -0,0 +1,2139 @@ +/* + function for draw controls +*/ + +//--------------------------------------------------------------------------------- +// fill buffer by value +//--------------------------------------------------------------------------------- +void FillArrea(void *buf,DWORD size,BYTE bits_per_pixel,DWORD value) +{ + DWORD i,j; + char r,g,b; + + switch(bits_per_pixel) + { + case 32: + { + j=(size >> 2)+4; + for(i=0;i> 8; + g=value & 0xff; + value=value >> 8; + r=value & 0xff; + + j=(size/3)+3; + for(i=0;iscreen.size_x-1) {x=screen.size_x-1;} + if (y>screen.size_y-1) {y=screen.size_y-1;} + if (x<0) {x=0;} + if (y<0) {y=0;} + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + x+=screen.x; + y+=screen.y; + gui_ksys_put_pixel_window(x,y,color); + break; + } + case DRAW_OUTPUT_BUFFER: + { + ptr=screen.buffer; + switch(screen.bits_per_pixel) + { + case 24: + { + ptr=ptr+(y*screen.size_x+x)*3; + b=color & 0xff; + color=color >>8; + g=color & 0xff; + color=color >>8; + r=color & 0xff; + + ptr[0]=b; + ptr[1]=g; + ptr[2]=r; + break; + } + case 32: + { + ptr2=(DWORD*)ptr+y*screen.size_x+x; + *ptr2=color; + break; + } + default: break; + } + break; + } + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing pixels on screen with finition +//--------------------------------------------------------------------------------- +void DrawPixelFinit(struct FINITION *fin,int x,int y,DWORD color) +{ + if (x>=fin->x && x<=fin->x+fin->sizex-1 && + y>=fin->y && y<=fin->y+fin->sizey-1) DrawPixel(x,y,color); +} + + +//--------------------------------------------------------------------------------- +// get color of pixel inc coordinates x,y +//--------------------------------------------------------------------------------- +DWORD GetColorPixel(int x,int y) +{ + char r,g,b; + char *ptr; + DWORD color,coordinates; + DWORD *ptr2; + + if (x>screen.size_x-1) {x=screen.size_x-1;} + if (y>screen.size_y-1) {y=screen.size_y-1;} + if (x<0) {x=0;} + if (y<0) {y=0;} + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + x+=screen.x; + y+=screen.y; + coordinates=x; + coordinates=coordinates << 16; + coordinates +=y; + color=gui_ksys_get_color_pixel_window(coordinates); + break; + } + case DRAW_OUTPUT_BUFFER: + { + ptr=screen.buffer; + switch(screen.bits_per_pixel) + { + case 24: + { + ptr=ptr+(y*screen.size_x+x)*3; + color=*ptr; + color=color & 0xffffff; + break; + } + case 32: + { + ptr2=(DWORD*)ptr+y*screen.size_x+x; + color=*ptr2; + break; + } + default: break; + } + } + } + return(color); +} + +//--------------------------------------------------------------------------------- +// draw vertical line on screen +//--------------------------------------------------------------------------------- +void DrawVerticalLine(int x,int y1,int y2,DWORD color) +{ + char r,g,b; + char *ptr; + DWORD *ptr2; + int a,i,count; + + if (x>screen.size_x-1) {x=screen.size_x-1;} + if (y1>screen.size_y-1) {y1=screen.size_y-1;} + if (y2>screen.size_y-1) {y2=screen.size_y-1;} + if (x<0) {x=0;} + if (y1<0) {y1=0;} + if (y2<0) {y2=0;} + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + x+=screen.x; + y1+=screen.y; + y2+=screen.y; + gui_ksys_draw_line_window(x,y1,x,y2,color); + break; + } + case DRAW_OUTPUT_BUFFER: + { + if (y1>8; + g=color & 0xff; + color=color >>8; + r=color & 0xff; + + a=screen.size_x*3; + for(i=0;i<=count;i++) + { + ptr[0]=b; + ptr[1]=g; + ptr[2]=r; + ptr+=a; + } + break; + } + case 32: + { + ptr2=(DWORD*)ptr+a*screen.size_x+x; + a=screen.size_x; + for(i=0;i<=count;i++) + { + *ptr2=color; + ptr2+=a; + } + break; + } + default: break; + } + } + } +} + +//--------------------------------------------------------------------------------- +// draw finited vertical line on screen +//--------------------------------------------------------------------------------- +void DrawVerticalLineFinit(struct FINITION *fin,int x,int y1,int y2,DWORD color) +{ + int xmin,xmax,ymin,ymax,v,sy; + + xmin=fin->x; + xmax=fin->x+fin->sizex-1; + ymin=fin->y; + ymax=fin->y+fin->sizey-1; + + if (y2xmax) return; + if (y2ymax) return; + + //finit x coordinates and sizex + sy=y1-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y1=ymin; + if (y2>ymax) y2=ymax; + } + DrawVerticalLine(x,y1,y2,color); +} + +//--------------------------------------------------------------------------------- +// draw horizontal line on screen +//--------------------------------------------------------------------------------- +void DrawHorizontalLine(int x1,int x2,int y,DWORD color) +{ + char r,g,b; + char *ptr; + int a,i,count; + DWORD *ptr2; + + if (y>screen.size_y-1) {y=screen.size_y-1;} + if (x1>screen.size_x-1) {x1=screen.size_x-1;} + if (x2>screen.size_x-1) {x2=screen.size_x-1;} + if (y<0) {y=0;} + if (x1<0) {x1=0;} + if (x2<0) {x2=0;} + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + x1+=screen.x; + x2+=screen.x; + y+=screen.y; + gui_ksys_draw_line_window(x1,y,x2,y,color); + break; + } + case DRAW_OUTPUT_BUFFER: + { + if (x1>8; + g=color & 0xff; + color=color >>8; + r=color & 0xff; + + for(i=0;i<=count;i++) + { + ptr[0]=b; + ptr[1]=g; + ptr[2]=r; + ptr=ptr+3; + } + break; + } + case 32: + { + ptr2=(DWORD*)ptr+y*screen.size_x+a; + + for(i=0;i<=count;i++) + { + *ptr2=color;ptr2++; + } + break; + } + default:break; + } + } + } +} + +//--------------------------------------------------------------------------------- +// draw finited vertical line on screen +//--------------------------------------------------------------------------------- +void DrawHorizontalLineFinit(struct FINITION *fin,int x1,int x2,int y,DWORD color) +{ + int xmin,xmax,ymin,ymax,v,sx; + + xmin=fin->x; + xmax=fin->x+fin->sizex-1; + ymin=fin->y; + ymax=fin->y+fin->sizey-1; + + if (x2ymax) return; + if (x2xmax) return; + + //finit x coordinates and sizex + sx=x1-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x1=xmin; + if (x2>xmax) x2=xmax; + } + DrawHorizontalLine(x1,x2,y,color); +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing line on screen +//--------------------------------------------------------------------------------- +int sign(int value) +{ + if (value==0) return(0); + if (value<0) {return(-1);} + else {return(1);} +} + +int abs(int value) +{ + if (value<0) {value=-value;} + + return(value); +} + +void DrawLine(int x1, int y1, int x2, int y2,DWORD color) +{ + int x; + int y; + int dx; + int dy; + int sx; + int sy; + int z; + int e; + int i; + char ch; + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + if (y1>screen.size_y-1) {y1=screen.size_y-1;} + if (y2>screen.size_y-1) {y2=screen.size_y-1;} + if (x1>screen.size_x-1) {x1=screen.size_x-1;} + if (x2>screen.size_x-1) {x2=screen.size_x-1;} + if (y1<0) {y1=0;} + if (y2<0) {y2=0;} + if (x1<0) {x1=0;} + if (x2<0) {x2=0;} + + x1+=screen.x; + x2+=screen.x; + y1+=screen.y; + y2+=screen.y; + gui_ksys_draw_line_window(x1,y1,x2,y2,color); + break; + } + case DRAW_OUTPUT_BUFFER: + { + + x = x1; + y = y1; + dx = abs(x2-x1); + dy = abs(y2-y1); + sx = sign(x2-x1); + sy = sign(y2-y1); + + if( dx==0 && dy==0 ) + { + DrawPixel(x1, y1,color); + return; + } + if( dy>dx ) + { + z = dx; + dx = dy; + dy = z; + ch = 1; + } + else + { + ch = 0; + } + e = 2*dy-dx; + i = 1; + + do + { + DrawPixel(x,y,color); + while(e>=0) + { + if( ch==1 ) x = x+sx; + else y = y+sy; + + if( ch==1 ) y = y+sy; + else x = x+sx; + + e = e-2*dx; + } + if( ch==1 ) y = y+sy; + else x = x+sx; + + e = e+2*dy; + i++; + } + while(i<=dx); + DrawPixel(x, y,color); + break; + } + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing rectangle on screen +//--------------------------------------------------------------------------------- +void DrawRectangle(int x,int y,int size_x,int size_y,DWORD color) +{ + + if (size_x==0 || size_y==0) return; + + DrawHorizontalLine(x,x+size_x-1,y,color); + DrawVerticalLine(x+size_x-1,y,y+size_y-1,color); + DrawHorizontalLine(x,x+size_x-1,y+size_y-1,color); + DrawVerticalLine(x,y,y+size_y-1,color); +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing finited rectangle on screen +//--------------------------------------------------------------------------------- +void DrawRectangleFinit(struct FINITION *fin,int x,int y,int size_x,int size_y,DWORD color) +{ + + if (size_x==0 || size_y==0) return; + + DrawHorizontalLineFinit(fin,x,x+size_x-1,y,color); + DrawVerticalLineFinit(fin,x+size_x-1,y,y+size_y-1,color); + DrawHorizontalLineFinit(fin,x,x+size_x-1,y+size_y-1,color); + DrawVerticalLineFinit(fin,x,y,y+size_y-1,color); +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing filled rectangle on screen +//--------------------------------------------------------------------------------- +void DrawFilledRectangle(int x,int y,int size_x,int size_y,DWORD color) +{ + int i,j; + int x1,y1,x2,y2; + + if (size_x==0 || size_y==0) return; + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + x1=x; + y1=y; + x2=x+size_x-1; + y2=y+size_y-1; + if (y1>screen.size_y-1) {y1=screen.size_y-1;} + if (y2>screen.size_y-1) {y2=screen.size_y-1;} + if (x1>screen.size_x-1) {x1=screen.size_x-1;} + if (x2>screen.size_x-1) {x2=screen.size_x-1;} + if (y1<0) {y1=0;} + if (y2<0) {y2=0;} + if (x1<0) {x1=0;} + if (x2<0) {x2=0;} + + size_x=x2-x1+1; + size_y=y2-y1+1; + x1+=screen.x; + y1+=screen.y; + + gui_ksys_draw_filled_rectangle_window(x1,y1,size_x,size_y,color); + break; + } + case DRAW_OUTPUT_BUFFER: + { + j=y; + for(i=0;i> 8; + g_f=color & 0xff; + color=color >> 8; + r_f=color & 0xff; + + color=color_to; + b_t=color & 0xff; + color=color >> 8; + g_t=color & 0xff; + color=color >> 8; + r_t=color & 0xff; + + div=sizey-1; + d_r=(float)(r_t-r_f); + d_r=d_r/div; + d_g=(float)(g_t-g_f); + d_g=d_g/div; + d_b=(float)(b_t-b_f); + d_b=d_b/div; + + f_r=r_f; + f_g=g_f; + f_b=b_f; + + r=r_f; + g=g_f; + b=b_f; + + if (flag_up==TRUE) + { + j=y+sizey-1; + dj=-1; + } + else + { + j=y; + dj=1; + } + + + for(i=0;i> 8; + g_f=color & 0xff; + color=color >> 8; + r_f=color & 0xff; + + color=color_to; + b_t=color & 0xff; + color=color >> 8; + g_t=color & 0xff; + color=color >> 8; + r_t=color & 0xff; + + div=sizex-1; + d_r=(float)(r_t-r_f); + d_r=d_r/div; + d_g=(float)(g_t-g_f); + d_g=d_g/div; + d_b=(float)(b_t-b_f); + d_b=d_b/div; + + f_r=r_f; + f_g=g_f; + f_b=b_f; + + r=r_f; + g=g_f; + b=b_f; + + if (flag_left==TRUE) + { + j=x; + dj=1; + } + else + { + j=x+sizex-1; + dj=-1; + } + + for(i=0;i=x) + { + DrawPixel(x+xc,y+yc,color); + DrawPixel(x+xc,-y+yc,color); + DrawPixel(-x+xc,y+yc,color); + DrawPixel(-x+xc,-y+yc,color); + DrawPixel(y+xc,x+yc,color); + DrawPixel(y+xc,-x+yc,color); + DrawPixel(-y+xc,x+yc,color); + DrawPixel(-y+xc,-x+yc,color); + if( d<0 ) + { + d = d+4*x+6; + } + else + { + d = d+4*(x-y)+10; + y--; + } + x++; + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing circle on screen with finition +//--------------------------------------------------------------------------------- +void DrawCircleFinit(struct FINITION *fin,int xc, int yc, int r,DWORD color) +{ + int x; + int y; + int d; + + x = 0; + y = r; + d = 3-2*r; + while(y>=x) + { + DrawPixelFinit(fin,x+xc,y+yc,color); + DrawPixelFinit(fin,x+xc,-y+yc,color); + DrawPixelFinit(fin,-x+xc,y+yc,color); + DrawPixelFinit(fin,-x+xc,-y+yc,color); + DrawPixelFinit(fin,y+xc,x+yc,color); + DrawPixelFinit(fin,y+xc,-x+yc,color); + DrawPixelFinit(fin,-y+xc,x+yc,color); + DrawPixelFinit(fin,-y+xc,-x+yc,color); + if( d<0 ) + { + d = d+4*x+6; + } + else + { + d = d+4*(x-y)+10; + y--; + } + x++; + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing filled circle on screen +//--------------------------------------------------------------------------------- +void DrawFilledCircle(int xc, int yc, int r,DWORD color) +{ + int xl,yu,xr,yd; + int i,j; + DWORD pixcolor; + + DrawCircle(xc,yc,r,color); + + yu=yc; + yd=yc; + for(i=0;ir) break; + } + j=0; + //fill right up + while((pixcolor=GetColorPixel(xr,yu))!=color) + { + DrawPixel(xr,yu,color); + xr++; + j++; + if (j>r) break; + } + + xl=xc; + xr=xc+1; + j=0; + //fill left down + while((pixcolor=GetColorPixel(xl,yd))!=color) + { + DrawPixel(xl,yd,color); + xl--; + j++; + if (j>r) break; + } + j=0; + //fill right down + while((pixcolor=GetColorPixel(xr,yd))!=color) + { + DrawPixel(xr,yd,color); + xr++; + j++; + if (j>r) break; + } + yu--; + yd++; + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing filled circle on screen with finition +//--------------------------------------------------------------------------------- +void DrawFilledCircleFinit(struct FINITION *fin,int xc, int yc, int r,DWORD color) +{ + int xl,yu,xr,yd; + int i,j; + DWORD pixcolor; + + DrawCircleFinit(fin,xc,yc,r,color); + + yu=yc; + yd=yc; + for(i=0;i=fin->x && xl<=fin->x+fin->sizex && + yu>=fin->y && yu<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xl,yu); + if (pixcolor!=color) DrawPixel(xl,yu,color); + else break; + } + xl--; + } + //fill right up + for(j=0;j=fin->x && xr<=fin->x+fin->sizex && + yu>=fin->y && yu<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xr,yu); + if (pixcolor!=color) DrawPixel(xr,yu,color); + else break; + } + xr++; + } + + xl=xc; + xr=xc+1; + //fill left down + for(j=0;j=fin->x && xl<=fin->x+fin->sizex && + yd>=fin->y && yd<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xl,yd); + if (pixcolor!=color) DrawPixel(xl,yd,color); + else break; + } + xl--; + } + //fill right down + for(j=0;j=fin->x && xr<=fin->x+fin->sizex && + yd>=fin->y && yd<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xr,yd); + if (pixcolor!=color) DrawPixel(xr,yd,color); + else break; + } + xr++; + } + yu--; + yd++; + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing ellipse on screen +//--------------------------------------------------------------------------------- +void DrawEllipse(int x,int y,int a,int b,DWORD color) +{ + int col,i,row,bnew; + long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d; + + b_square=b*b; + a_square=a*a; + row=b; + col=0; + two_a_square=a_square<<1; + four_a_square=a_square<<2; + four_b_square=b_square<<2; + two_b_square=b_square<<1; + d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square); + while(a_square*(row)>b_square*(col)) + { + DrawPixel(col+x,row+y,color); + DrawPixel(col+x,y-row,color); + DrawPixel(x-col,row+y,color); + DrawPixel(x-col,y-row,color); + + if (d>=0) + { + row--; + d-=four_a_square*(row); + } + d+=two_b_square*(3+(col<<1)); + col++; + } + + d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square; + while ((row) + 1) + { + DrawPixel(col+x, row+y, color); + DrawPixel(col+x, y-row, color); + DrawPixel(x-col, row+y, color); + DrawPixel(x-col, y-row, color); + + if (d<=0) + { + col++; + d+=four_b_square*col; + } + row--; + d+=two_a_square*(3-(row <<1)); + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing ellipse on screen with finition +//--------------------------------------------------------------------------------- +void DrawEllipseFinit(struct FINITION *fin,int x,int y,int a,int b,DWORD color) +{ + int col,i,row,bnew; + long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d; + + b_square=b*b; + a_square=a*a; + row=b; + col=0; + two_a_square=a_square<<1; + four_a_square=a_square<<2; + four_b_square=b_square<<2; + two_b_square=b_square<<1; + d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square); + + while(a_square*(row)>b_square*(col)) + { + DrawPixelFinit(fin,col+x,row+y,color); + DrawPixelFinit(fin,col+x,y-row,color); + DrawPixelFinit(fin,x-col,row+y,color); + DrawPixelFinit(fin,x-col,y-row,color); + + if (d>=0) + { + row--; + d-=four_a_square*(row); + } + d+=two_b_square*(3+(col<<1)); + col++; + } + + d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square; + while ((row) + 1) + { + DrawPixelFinit(fin,col+x, row+y, color); + DrawPixelFinit(fin,col+x, y-row, color); + DrawPixelFinit(fin,x-col, row+y, color); + DrawPixelFinit(fin,x-col, y-row, color); + + if (d<=0) + { + col++; + d+=four_b_square*col; + } + row--; + d+=two_a_square*(3-(row <<1)); + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing filled ellips on screen +//--------------------------------------------------------------------------------- +void DrawFilledEllipse(int xc, int yc, int a,int b,DWORD color) +{ + int xl,yu,xr,yd; + int i,j; + DWORD pixcolor; + + DrawEllipse(xc,yc,a,b,color); + + yu=yc; + yd=yc; + for(i=0;ia) break; + } + j=0; + //fill right up + while((pixcolor=GetColorPixel(xr,yu))!=color) + { + DrawPixel(xr,yu,color); + xr++; + j++; + if (j>a) break; + } + + xl=xc; + xr=xc+1; + j=0; + //fill left down + while((pixcolor=GetColorPixel(xl,yd))!=color) + { + DrawPixel(xl,yd,color); + xl--; + j++; + if (j>a) break; + } + j=0; + //fill right down + while((pixcolor=GetColorPixel(xr,yd))!=color) + { + DrawPixel(xr,yd,color); + xr++; + j++; + if (j>a) break; + } + yu--; + yd++; + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing filled circle on screen with finition +//--------------------------------------------------------------------------------- +void DrawFilledEllipseFinit(struct FINITION *fin,int xc, int yc, int a,int b,DWORD color) +{ + int xl,yu,xr,yd; + int i,j; + DWORD pixcolor; + + DrawEllipseFinit(fin,xc,yc,a,b,color); + + yu=yc; + yd=yc; + for(i=0;i=fin->x && xl<=fin->x+fin->sizex && + yu>=fin->y && yu<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xl,yu); + if (pixcolor!=color) DrawPixel(xl,yu,color); + else break; + } + xl--; + } + //fill right up + for(j=0;j=fin->x && xr<=fin->x+fin->sizex && + yu>=fin->y && yu<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xr,yu); + if (pixcolor!=color) DrawPixel(xr,yu,color); + else break; + } + xr++; + } + + xl=xc; + xr=xc+1; + //fill left down + for(j=0;j=fin->x && xl<=fin->x+fin->sizex && + yd>=fin->y && yd<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xl,yd); + if (pixcolor!=color) DrawPixel(xl,yd,color); + else break; + } + xl--; + } + //fill right down + for(j=0;j=fin->x && xr<=fin->x+fin->sizex && + yd>=fin->y && yd<=fin->y+fin->sizey) + { + pixcolor=GetColorPixel(xr,yd); + if (pixcolor!=color) DrawPixel(xr,yd,color); + else break; + } + xr++; + } + yu--; + yd++; + } +} + +//--------------------------------------------------------------------------------- +// libGUI function drawing image on screen +//--------------------------------------------------------------------------------- +void DrawImage(int x,int y,int sizex,int sizey,char bits_per_pixel,char *img) +{ + char r,g,b; + int i,j,countx,county; + int x2,y2; + DWORD pitch_src,pitch_screen,add_src,add_screen; + char *ptr_src,*ptr_screen,ptr_max; + char *ptr_src2,*ptr_screen2; + DWORD *ptr_src3; + + if (img==NULL) return; + if (x>screen.size_x-1) return; + if (y>screen.size_y-1) return; + + x2=x+sizex-1; + y2=y+sizey-1; + + + if (y2>screen.size_y-1) {y2=screen.size_y-1;} + if (x2>screen.size_x-1) {x2=screen.size_x-1;} + if (y<0) y=0; + if (y2<0) y2=0; + if (x<0) x=0; + if (x2<0) x2=0; + + countx=x2-x+1; + county=y2-y+1; + + switch(screen.draw_output) + { + case DRAW_OUTPUT_SCREEN: + { + x+=screen.x; + y+=screen.y; + + switch(screen.bits_per_pixel) + { + case 32: + { + if (bits_per_pixel==32) + {//convert 32 bit image to 24 bit image + j=sizex*sizey; + ptr_src=img; + ptr_screen=malloc(j*3); + ptr_screen2=ptr_screen; + for(i=0;ix; + xmax=fin->x+fin->sizex-1; + ymin=fin->y; + ymax=fin->y+fin->sizey-1; + + x1=x; + y1=y; + x2=x1+sizex-1; + y2=y1+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + if (x1>=xmin && x2<=xmax && y1>=ymin && y2<=ymax) + { + DrawImage(x,y,sizex,sizey,bits_per_pixel,img); + return; + } + + //finit x coordinates and sizex + sx=x1-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x1=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y1-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y1=ymin; + if (y2>ymax) y2=ymax; + } + countx=x2-x1+1; + county=y2-y1+1; + + //cut finited rectangle from image and move them into buffer + switch(bits_per_pixel) + { + case 32: + case 24: + case 16: + case 8: + { //allocate buffer + bytes_per_pixel=bits_per_pixel >> 3; + buf=malloc(countx*county*bytes_per_pixel); + ptr_dest=buf; + + pitch_src=sizex*bytes_per_pixel; + ptr_src=img+pitch_src*(y1-y)+(x1-x)*bytes_per_pixel; + add_src=(sizex-countx)*bytes_per_pixel; + countline=countx*bytes_per_pixel; + //copy line of byte with size x + for(i=0;ix; + xmax=finition->x+finition->sizex-1; + ymin=finition->y; + ymax=finition->y+finition->sizey-1; + + switch(tool_name) + { + //tool Pixel + case TOOL_PIXEL: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + if (x>=finition->x && x<=finition->x+finition->sizex + && y>=finition->y && y<=finition->y+finition->sizey) + { //pixel inside finition arrea + DrawPixel(x,y,color); + } + } + else + { //no finition + DrawPixel(x,y,color); + } + break; + } + //tool Line + case TOOL_LINE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + x2=va_arg(arguments,int); + y2=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + sizex=abs(x2-x); + sizey=abs(y2-y); + + if (CheckCrossRectangles(finition->x,finition->y,finition->sizex, + finition->sizey,x,y,sizex,sizey)==FALSE) break; + + if (x>=finition->x && x<=finition->x+finition->sizex && + y>=finition->y && y<=finition->y+finition->sizey && + x2>=finition->x && x2<=finition->x+finition->sizex && + y2>=finition->y && y2<=finition->y+finition->sizey) + { + //line inside finition arrea + DrawLine(x,y,x2,y2,color); + break; + } + + + if (x==x2) break; + + //find coefficients of line + x_l1=x; + y_l1=y; + x_l2=x2; + y_l2=y2; + k=(y_l1-y_l2)/(x_l1-x_l2); + b=(y_l2*x_l1-y_l1*x_l2)/(x_l1-x_l2); + + sx=x2-x;//vectore x + sy=y2-y;//vectore y + + if (x>=finition->x && x<=finition->x+finition->sizex && + y>=finition->y && y<=finition->y+finition->sizey) + { //point x,y inside finition arrea + //check cross with left vertical line of finition + y_l1=k*finition->x+b; + y_i=(int)y_l1; + if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx<0) + { //first point for finited line + x2=finition->x; + y2=y_i; + DrawLine(x,y,x2,y2,color); + break; + } + //check cross with up horizontal line of finition + x_l1=(finition->y-b)/k; + x_i=(int)x_l1; + if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy<0) + { + x2=x_i; + y2=finition->y; + DrawLine(x,y,x2,y2,color); + break; + } + //check cross with right vertical line of finition + y_l1=k*(finition->x+finition->sizex)+b; + y_i=(int)y_l1; + if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx>0) + { + x2=finition->x+finition->sizex; + y2=y_i; + DrawLine(x,y,x2,y2,color); + break; + } + //check cross with down horizontal line of finition + x_l1=((finition->y+finition->sizey)-b)/k; + x_i=(int)x_l1; + if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy>0) + { + x2=x_i; + y2=finition->y+finition->sizey; + DrawLine(x,y,x2,y2,color); + break; + } + } + + if (x2>=finition->x && x2<=finition->x+finition->sizex && + y2>=finition->y && y2<=finition->y+finition->sizey) + { //point x,y inside finition arrea + //check cross with left vertical line of finition + y_l1=k*finition->x+b; + y_i=(int)y_l1; + if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx>0) + { //first point for finited line + x=finition->x; + y=y_i; + DrawLine(x,y,x2,y2,color); + break; + } + //check cross with up horizontal line of finition + x_l1=(finition->y-b)/k; + x_i=(int)x_l1; + if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy>0) + { + x=x_i; + y=finition->y; + DrawLine(x,y,x2,y2,color); + break; + } + //check cross with right vertical line of finition + y_l1=k*(finition->x+finition->sizex)+b; + y_i=(int)y_l1; + if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx<0) + { + x=finition->x+finition->sizex; + y=y_i; + DrawLine(x,y,x2,y2,color); + break; + } + //check cross with down horizontal line of finition + x_l1=((finition->y+finition->sizey)-b)/k; + x_i=(int)x_l1; + if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy<0) + { + x=x_i; + y=finition->y+finition->sizey; + DrawLine(x,y,x2,y2,color); + break; + } + } + + first=FALSE; + second=FALSE; + //check cross with left vertical line of finition + y_l1=k*finition->x+b; + y_i=(int)y_l1; + if (y_i>=finition->y && y_i<=finition->y+finition->sizey) + { //first point for finited line + x=finition->x; + y=y_i; + first=TRUE; + } + //check cross with up horizontal line of finition + x_l1=(finition->y-b)/k; + x_i=(int)x_l1; + if (x_i>=finition->x && x_i<=finition->x+finition->sizex) + { + if (first==FALSE) + { + x=x_i; + y=finition->y; + } + else + { + x2=x_i; + y2=finition->y; + second=TRUE; + } + } + //check cross with right vertical line of finition + y_l1=k*(finition->x+finition->sizex)+b; + y_i=(int)y_l1; + if (y_i>=finition->y && y_i<=finition->y+finition->sizey) + { + if (first==FALSE) + { + x=finition->x+finition->sizex; + y=y_i; + } + else + { + x2=finition->x+finition->sizex; + y2=y_i; + second=TRUE; + } + } + //check cross with down horizontal line of finition + x_l1=((finition->y+finition->sizey)-b)/k; + x_i=(int)x_l1; + if (x_i>=finition->x && x_i<=finition->x+finition->sizex) + { + if (first==FALSE) + { + x=x_i; + y=finition->y+finition->sizey; + } + else + { + x2=x_i; + y2=finition->y+finition->sizey; + second=TRUE; + } + } + + if (first==TRUE && second==TRUE) + { + //draw finited line + DrawLine(x,y,x2,y2,color); + } + break; + + } + else + { //no finition + DrawLine(x,y,x2,y2,color); + } + break; + } + //tool VerticalLine + case TOOL_VERTICAL_LINE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + y2=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + DrawVerticalLineFinit(finition,x,y,y2,color); + } + else + { + DrawVerticalLine(x,y,y2,color); + } + break; + } + //tool HorizontalLine + case TOOL_HORIZONTAL_LINE: + { + x=va_arg(arguments,int); + x2=va_arg(arguments,int); + y=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + DrawHorizontalLineFinit(finition,x,x2,y,color); + } + else + { + DrawHorizontalLine(x,x2,y,color); + } + break; + } + + //tool Rectangle + case TOOL_RECTANGLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + x2=x+sizex-1; + y2=y+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + DrawRectangleFinit(finition,x,y,sizex,sizey,color); + } + else + { + DrawRectangle(x,y,sizex,sizey,color); + } + break; + } + //tool FilledRectangle + case TOOL_FILLED_RECTANGLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + x2=x+sizex-1; + y2=y+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + //finit x coordinates and sizex + sx=x-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y=ymin; + if (y2>ymax) y2=ymax; + } + + sizex=x2-x+1; + sizey=y2-y+1; + + DrawFilledRectangle(x,y,sizex,sizey,color); + } + else + { + DrawFilledRectangle(x,y,sizex,sizey,color); + } + break; + } + //tool GradientUpFilledRectangle + case TOOL_GRADIENT_UP_FILLED_RECTANGLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color_from=va_arg(arguments,DWORD); + color_to=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + x2=x+sizex-1; + y2=y+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + //finit x coordinates and sizex + sx=x-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y=ymin; + if (y2>ymax) y2=ymax; + } + + sizex=x2-x+1; + sizey=y2-y+1; + + DrawGradientUpDownFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to); + } + else + { + DrawGradientUpDownFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to); + } + break; + } + //tool GradientDownFilledRectangle + case TOOL_GRADIENT_DOWN_FILLED_RECTANGLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color_from=va_arg(arguments,DWORD); + color_to=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + x2=x+sizex-1; + y2=y+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + //finit x coordinates and sizex + sx=x-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y=ymin; + if (y2>ymax) y2=ymax; + } + + sizex=x2-x+1; + sizey=y2-y+1; + + DrawGradientUpDownFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to); + } + else + { + DrawGradientUpDownFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to); + } + break; + } + //tool GradientLeftFilledRectangle + case TOOL_GRADIENT_LEFT_FILLED_RECTANGLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color_from=va_arg(arguments,DWORD); + color_to=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + x2=x+sizex-1; + y2=y+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + //finit x coordinates and sizex + sx=x-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y=ymin; + if (y2>ymax) y2=ymax; + } + + sizex=x2-x+1; + sizey=y2-y+1; + + DrawGradientLeftRightFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to); + } + else + { + DrawGradientLeftRightFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to); + } + break; + } + //tool GradientRightFilledRectangle + case TOOL_GRADIENT_RIGHT_FILLED_RECTANGLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color_from=va_arg(arguments,DWORD); + color_to=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + x2=x+sizex-1; + y2=y+sizey-1; + + if (x2xmax) return; + if (y2ymax) return; + + //finit x coordinates and sizex + sx=x-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y=ymin; + if (y2>ymax) y2=ymax; + } + + sizex=x2-x+1; + sizey=y2-y+1; + + DrawGradientLeftRightFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to); + } + else + { + DrawGradientLeftRightFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to); + } + break; + } + //tool Circle + case TOOL_CIRCLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + radius=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + DrawCircleFinit(finition,x,y,radius,color); + } + else + { + DrawCircle(x,y,radius,color); + } + break; + } + //tool FilledCircle + case TOOL_FILLED_CIRCLE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + radius=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + DrawFilledCircleFinit(finition,x,y,radius,color); + } + else + { + DrawFilledCircle(x,y,radius,color); + } + break; + } + //tool Ellipse + case TOOL_ELLIPSE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + DrawEllipseFinit(finition,x,y,sizex,sizey,color); + } + else + { + DrawEllipse(x,y,sizex,sizey,color); + } + break; + } + //tool FilledEllipse + case TOOL_FILLED_ELLIPSE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + color=va_arg(arguments,DWORD); + + if (finition->flags & FINITION_ON) + { + DrawFilledEllipseFinit(finition,x,y,sizex,sizey,color); + } + else + { + DrawFilledEllipse(x,y,sizex,sizey,color); + } + break; + } + //tool Image + case TOOL_IMAGE: + { + x=va_arg(arguments,int); + y=va_arg(arguments,int); + sizex=va_arg(arguments,int); + sizey=va_arg(arguments,int); + bits_per_pixel=(char)va_arg(arguments,int); + img=va_arg(arguments,char*); + + if (finition->flags & FINITION_ON) + { + DrawImageFinit(finition,x,y,sizex,sizey,bits_per_pixel,img); + } + else + { + DrawImage(x,y,sizex,sizey,bits_per_pixel,img); + } + break; + } + } + va_end(arguments); +} + + diff --git a/programs/develop/new libGUI_C/SRC/fonts_meneger.h b/programs/develop/new libGUI_C/SRC/fonts_meneger.h new file mode 100755 index 0000000000..d2fc3ad650 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/fonts_meneger.h @@ -0,0 +1,63 @@ +/* + font meneger header structure + */ + +#define FONT_FLAG_DEFAULT_FONT_ON 0x1 +#define FONT_FLAG_DEFAULT_FONT_OFF 0xfe +#define FONT_FLAG_DRAW_BACKGROUND_ON 0x2 +#define FONT_FLAG_DRAW_BACKGROUND_OFF 0xfd +#define FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON 0x4 +#define FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_OFF 0xfb + +#define FONT_CONSTANT_SIZE -1 + +//some types encoding characters +#define FONT_TYPE_ASCII 0x1 +#define FONT_TYPE_UNICODE 0x2 + +/////////////////////////////////////////////////////////// +// some ASCII encodings +/////////////////////////////////////////////////////////// + +//cyrillic encodings +#define FONT_ENCODING_CYRILLIC_IBM866 0x1 +#define FONT_ENCODING_CYRILLIC_IBM437 0x2 +#define FONT_ENCODING_CYRILLIC_KOI8R 0x4 +#define FONT_ENCODING_CYRILLIC_ISO8859_5 0x8 +#define FONT_ENCODING_CYRILLIC_CP1251 0x10 + +#pragma pack(push,1) +static struct +{ + DWORD *fnt_fd; + DWORD *fnt_bk; + DWORD *default_font; + DWORD number_fonts; +}FontsMeneger; +#pragma pack(pop) + +#pragma pack(push,1) +struct FONT +{ + DWORD *fnt_draw; + DWORD *fnt_unpacker; + DWORD *fnt_fd; + DWORD *fnt_bk; + int sizex; + int sizey; + int size; + int encoding_type; + char *font; + char *fnt_name; + DWORD type; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct FONT font_t; + +static char *default_fonts_path="/sys/fonts/"; + +void (*DrawFont)(finition_t *fin,int fx,int fy,DWORD color,DWORD background_color,font_t *font,BYTE *s); + + diff --git a/programs/develop/new libGUI_C/SRC/fonts_meneger.inc b/programs/develop/new libGUI_C/SRC/fonts_meneger.inc new file mode 100755 index 0000000000..5ce0e75016 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/fonts_meneger.inc @@ -0,0 +1,373 @@ +/* + menegement of fonts + */ + +//--------------------------------------------------------------------------------- +// destroy font +//--------------------------------------------------------------------------------- +void DestroyFont(font_t *font) +{ + font_t *seek_font; + font_t *exchange_font; + font_t *last_font; + font_t *next_font; + + if (font==(font_t*)NULL) return; + + if (FontsMeneger.fnt_bk==FontsMeneger.fnt_fd) + { + //parent have got alone font + if (FontsMeneger.fnt_bk==(DWORD*)font) + { +#ifdef DEBUG + printf("\ndestroyed font %d font name=%s",(int)font,(char*)font->fnt_name); +#endif + free(font); + FontsMeneger.fnt_bk=(DWORD*)NULL; + FontsMeneger.fnt_fd=(DWORD*)NULL; + } + return; + } + + seek_font=(font_t*)FontsMeneger.fnt_bk; + while(seek_font!=(font_t*)NULL) + { + if (seek_font==font) + { + //delete font from fonts's cash + last_font=(font_t*)seek_font->fnt_bk; + next_font=(font_t*)seek_font->fnt_fd; + + if ((last_font!=(font_t*)NULL) && (next_font!=(font_t*)NULL)) + {//deliting font isn't first font and isn't endest + next_font->fnt_bk=(DWORD*)last_font; + last_font->fnt_fd=(DWORD*)next_font; + } + else + { + if (last_font==(font_t*)NULL) + {//deliting font is first font of Parend + FontsMeneger.fnt_bk=(DWORD*)next_font; + next_font->fnt_bk=(DWORD*)NULL; + if (next_font->fnt_fd==(DWORD*)NULL) + { + FontsMeneger.fnt_fd=(DWORD*)next_font; + FontsMeneger.fnt_bk=(DWORD*)next_font; + } + } + + if (next_font==(font_t*)NULL) + { + //there isn't next fonts + last_font->fnt_fd=(DWORD*)NULL; + FontsMeneger.fnt_fd=(DWORD*)last_font; + } + } +#ifdef DEBUG + printf("\ndestroyed font %d font name=%s",(int)font,(char*)font->fnt_name); +#endif + free(font); + break; + } + exchange_font=(font_t*)seek_font->fnt_fd; + seek_font=exchange_font; + } +} + +void *CreateFont(void) +{ + font_t *font; + font_t *backward_font; + + font=malloc(sizeof(struct FONT)); + + if (FontsMeneger.fnt_bk==(DWORD*)NULL) + {//not yet fonts + FontsMeneger.fnt_bk=(DWORD*)font; + FontsMeneger.fnt_fd=(DWORD*)font; + font->fnt_bk=(DWORD*)NULL; + font->fnt_fd=(DWORD*)NULL; + } + else + { + backward_font=(font_t*)FontsMeneger.fnt_fd; + FontsMeneger.fnt_fd=(DWORD*)font; + backward_font->fnt_fd=(DWORD*)font; + font->fnt_bk=(DWORD*)backward_font; + font->fnt_fd=(DWORD*)NULL; + } + return(font); +} +//////////////////////////////////////////////////////////////////////////////// +// CHAR.MT and CHAR2.MT fonts unpacker +//////////////////////////////////////////////////////////////////////////////// +void CHAR_MT_FontsUnpacker(unsigned char *loaded_font,font_t *font,char font_type) +{ + int i,j,k; + unsigned char c; + unsigned char *p; + + if (font_type==FALSE) + {//CHAR.MT + font->font=malloc(6*9*256); + p=(unsigned char*)font->font; + + for(j=0;j<256;j++) + { + for(i=0;i<9;i++) + { + c=(unsigned char)(*loaded_font); + p[5]=(unsigned char)(c & 0x20); + p[4]=(unsigned char)(c & 0x10); + p[3]=(unsigned char)(c & 0x8); + p[2]=(unsigned char)(c & 0x4); + p[1]=(unsigned char)(c & 0x2); + p[0]=(unsigned char)(c & 0x1); + + p+=6; + loaded_font++; + } + } + font->sizex=6; + font->sizey=9; + } + else + {//CHAR2.MT + font->font=malloc(8*10*256); + p=(unsigned char*)font->font; + + for(j=0;j<256;j++) + { + for(i=0;i<10;i++) + { + c=(unsigned char)(*loaded_font); + p[7]=(unsigned char)(c & 0x80); + p[6]=(unsigned char)(c & 0x40); + p[5]=(unsigned char)(c & 0x20); + p[4]=(unsigned char)(c & 0x10); + p[3]=(unsigned char)(c & 0x8); + p[2]=(unsigned char)(c & 0x4); + p[1]=(unsigned char)(c & 0x2); + p[0]=(unsigned char)(c & 0x1); + + p+=8; + loaded_font++; + } + } + font->sizex=8; + font->sizey=10; + } + + font->size=FONT_CONSTANT_SIZE; + font->type=FONT_TYPE_ASCII; + font->encoding_type=FONT_ENCODING_CYRILLIC_IBM866; +} + +//////////////////////////////////////////////////////////////////////////////// +// CHAR.MT and CHAR2.MT fonts draw +//////////////////////////////////////////////////////////////////////////////// +void MonofontDraw(finition_t *fin,int fx,int fy, + DWORD color,DWORD background_color, + font_t *font,unsigned char *s) +{ + unsigned int i,j,k,step,len; + int x,y,size_x,save_size_x,save_size_y; + unsigned char *p,*buf,*save_buf; + unsigned char c,draw_output; + + + step=font->sizex*font->sizey; + len=strlen(s); + + if (font->flags & FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON) + { + if (font->flags & FONT_FLAG_DRAW_BACKGROUND_ON) + {//there is a fon and not finition for draw + //alocate a buffer for draw text + size_x=font->sizex*len; + + c=screen.bits_per_pixel >> 3; + i=step*c*len; + buf=malloc(i); + + //save current screen parameters + save_buf=screen.buffer; + save_size_x=screen.size_x; + save_size_y=screen.size_y; + draw_output=screen.draw_output; + + //load parameters of local buffer + screen.buffer=buf; + screen.size_x=size_x; + screen.size_y=font->sizey; + screen.draw_output=DRAW_OUTPUT_BUFFER; + + //fill buffer by background color + FillArrea(buf,i,screen.bits_per_pixel,background_color); + + //draw text + x=0; + for(k=0;kfont+step*c; + for(j=0;jsizey;j++) + { + + for(i=0;isizex;i++) + { + if (*p) DrawPixel(x+i,j,color); + p++; + } + } + x=x+font->sizex; + } + + //restore screen parameters + screen.buffer=save_buf; + screen.size_x=save_size_x; + screen.size_y=save_size_y; + screen.draw_output=draw_output; + + //move text from local buffer to screen + if (fin->flags & FINITION_ON) + DrawImageFinit(fin,fx,fy,size_x,font->sizey,screen.bits_per_pixel,buf); + else + DrawImage(fx,fy,size_x,font->sizey,screen.bits_per_pixel,buf); + + //free local buffer + free(buf); + } + else + { + if (fin->flags & FINITION_ON) + {//not background and finition for draw + x=fx; + y=fy; + for(k=0;kfont+step*c; + for(j=0;jsizey;j++) + { + + for(i=0;isizex;i++) + { + if (*p) DrawPixelFinit(fin,x+i,y+j,color); + p++; + } + } + x=x+font->sizex; + } + } + else + {//not background and not finition for draw + x=fx; + y=fy; + for(k=0;kfont+step*c; + for(j=0;jsizey;j++) + { + + for(i=0;isizex;i++) + { + if (*p) DrawPixel(x+i,y+j,color); + p++; + } + } + x=x+font->sizex; + } + } + + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// fonts loader +//////////////////////////////////////////////////////////////////////////////// +font_t *LoadFont(char *fullfontname) +{ + char *path; + char *c; + BYTE *buf; + long filesize; + int len1,len2,i; + font_t *font; + static DWORD buf_for_size[2]; + static DWORD buf_for_pos[2]; + + path=malloc(263); + if (strchr(fullfontname,'/')==NULL) + { + len1=strlen(default_fonts_path); + len2=strlen(fullfontname); + memmove(path,default_fonts_path,len1); + memmove(path+len1,fullfontname,len2); + *(path+len1+len2)='\0'; + } + else + memmove(path,fullfontname,strlen(fullfontname)); + + if (gui_get_file_size(path,buf_for_size)==KOLIBRIOS_SYS_FILE_ACCESS_SUCCESSFULLY) + { + filesize=buf_for_size[0]; + buf=malloc(filesize); + //load fonts in buffer + gui_read_file(path,buf_for_pos,filesize,buf); + + free(path); + //register font + font=CreateFont(); + c=strrchr(fullfontname,'/'); + if(c==NULL) font->fnt_name=fullfontname; + else + font->fnt_name=(char*)(c+1); + + //check font type + c=strstr(font->fnt_name,"CHAR.MT");//check standart type of fonts + if (c!=NULL) + { + font->fnt_unpacker=(DWORD*)&CHAR_MT_FontsUnpacker; + font->fnt_draw=(DWORD*)&MonofontDraw; + CHAR_MT_FontsUnpacker(buf,font,FALSE);//CHAR.MT + free(buf); + font->flags=0; + font->flags|=FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON; + } + + c=strstr(font->fnt_name,"CHAR2.MT");//check standart type of fonts + if (c!=NULL) + { + font->fnt_unpacker=(DWORD*)&CHAR_MT_FontsUnpacker; + font->fnt_draw=(DWORD*)&MonofontDraw; + CHAR_MT_FontsUnpacker(buf,font,TRUE);//CHAR2.MT + free(buf); + font->flags=0; + font->flags|=FONT_FLAG_ORIENTATION_HORIZONTAL_FROM_LEFT_TO_RIGHT_ON; + } + //not other fonts yet + + } + else + { +#ifdef DEBUG + printf("\ncannot load font %s",path); +#endif + free(path); + return(NULL); + } + + FontsMeneger.number_fonts++; + return(font); +} + +void FreeFont(font_t *font) +{ + if (font==(font_t*)FontsMeneger.default_font) return; + + free(font->font); + DestroyFont(font); +} diff --git a/programs/develop/new libGUI_C/SRC/keys.h b/programs/develop/new libGUI_C/SRC/keys.h new file mode 100755 index 0000000000..75136e256c --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/keys.h @@ -0,0 +1,8 @@ +/* + scan codes of keys +*/ + +//Scan Codes of some keys in pressed state + #define SC_TAB 15 + #define SC_ENTER 28 + #define SC_SPACE 57 diff --git a/programs/develop/new libGUI_C/SRC/kolibri_system.h b/programs/develop/new libGUI_C/SRC/kolibri_system.h new file mode 100755 index 0000000000..d556566444 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/kolibri_system.h @@ -0,0 +1,657 @@ +/* + some system function of KolibriOS +*/ + +#define KOLIBRIOS_SYS_EVENT_REDRAW 1 +#define KOLIBRIOS_SYS_EVENT_KEYS 2 +#define KOLIBRIOS_SYS_EVENT_BUTTON_PRESSED 3 +#define KOLIBRIOS_SYS_EVENT_REDRAW_BACKGROUND 5 +#define KOLIBRIOS_SYS_EVENT_MOUSE 6 +#define KOLIBRIOS_SYS_EVENT_IPC 7 +#define KOLIBRIOS_SYS_EVENT_NET 8 +#define KOLIBRIOS_SYS_EVENT_DEBUG 9 + +#define KOLIBRIOS_SYS_MOUSE_BUTTON_LEFT_DOWN 0x1 +#define KOLIBRIOS_SYS_MOUSE_BUTTON_RIGHT_DOWN (0x1<<1) +#define KOLIBRIOS_SYS_MOUSE_BUTTON_MIDDLE_DOWN (0x1 <<2) +#define KOLIBRIOS_SYS_MOUSE_BUTTON_4_DOWN (0x1 <<3) +#define KOLIBRIOS_SYS_MOUSE_BUTTON_5_DOWN (0x1 <<4) + +#define KOLIBRIOS_SYS_FILE_ACCESS_SUCCESSFULLY 0 +#define KOLIBRIOS_SYS_FILE_UNDEFINED_PARTITION_OR_HARDDRIVE_BASE 1 +#define KOLIBRIOS_SYS_FILE_FUNCTION_DONT_SUPPOROTE_FOR_CURRENT_FILE_SYSTEM 2 +#define KOLIBRIOS_SYS_FILE_UNKNOWN_FILE_SYSTEM 3 +#define KOLIBRIOS_SYS_FILE_NOT_FOUND 5 +#define KOLIBRIOS_SYS_FILE_FINISHED 6 +#define KOLIBRIOS_SYS_FILE_POINTER_OUTOFMEMORY_APPLICATION 7 +#define KOLIBRIOS_SYS_FILE_MEMORY_OF_DEVICE_FILLED 8 +#define KOLIBRIOS_SYS_FILE_TABLE_DESTROYED 9 +#define KOLIBRIOS_SYS_FILE_ACCESS_DENITED 10 +#define KOLIBRIOS_SYS_FILE_DEVICE_ERROR 11 + +#pragma pack(push,1) +struct KOLIBRIOS_FILEIO +{ + DWORD number_subfunction; + DWORD offset_in_file_low; + DWORD offset_in_file_hight; + DWORD size; + DWORD *data; + BYTE null; + char *full_file_path; +}; +#pragma pack(pop) + +typedef struct KOLIBRIOS_FILEIO fileio_t; + +#pragma pack(push,1) +struct BLOCK_DATA_ENTRY_DIRECTORY +{ + DWORD attributes; + DWORD types_data_of_name; + DWORD time_created_file; + DWORD date_created_file; + DWORD time_last_access; + DWORD date_last_access; + DWORD time_last_modification; + DWORD date_last_modification; + DWORD file_size_low; + DWORD file_size_hight; + DWORD *filename; +}; +#pragma pack(pop) + +typedef struct BLOCK_DATA_ENTRY_DIRECTORY bded_t; + +#pragma pack(push,1) +struct PROCESS_TABLE +{ + int cpu_usage; //+0 + int window_pos_info; //+4 + short int reserved1; //+8 + char name[12]; //+10 + int memstart; //+22 + int memused; //+26 + int pid; //+30 + int winx_start; //+34 + int winy_start; //+38 + int winx_size; //+42 + int winy_size; //+46 + short int slot_info; //+50 + short int reserved2; //+52 + int clientx; //+54 + int clienty; //+58 + int clientwidth; //+62 + int clientheight; //+66 + unsigned char window_state; //+70 + char reserved3[1024-71]; //+71 +}; +#pragma pack(pop) + +typedef struct PROCESS_TABLE process_table_t; + +#pragma pack(push,1) +struct IMPORT +{ + char *name; + void *data; +}; +#pragma pack(pop) + +typedef struct IMPORT import_t; + +static DWORD gui_get_file_size(char *filename,DWORD *buf_for_size); +static DWORD gui_read_file(char *filename,DWORD *buf_pos_size,DWORD size_read,char *buf); +static DWORD gui_create_rewrite_file(char *filename,DWORD *buf_pos_size,DWORD size_write,char *buf); +static DWORD gui_append_to_file(char *filename,DWORD *buf_pos_size,DWORD size_write,char *buf); +static void gui_debug_out_str(char *s); +static void* gui_cofflib_getproc(import_t *lib, char *name); + +#define alwinline __attribute__((always_inline)) +//------------------------------------------------------------------------------------------ +// draw window +//------------------------------------------------------------------------------------------ +extern inline void __attribute__((always_inline)) gui_ksys_draw_window(DWORD x,DWORD y,DWORD sizex,DWORD sizey,DWORD flags) +{ + __asm__ __volatile__( + "xorl %%eax,%%eax\n\t" + "movl %0,%%ebx\n\t" + "movl %1,%%ecx\n\t" + "movl %4,%%edx\n\t" + "shll $16,%%ebx\n\t" + "shll $16,%%ecx\n\t" + "addl %2,%%ebx\n\t" + "addl %3,%%ecx\n\t" + "int $0x40" + :/*no output*/ + :"g"(x),"g"(y),"g"(sizex),"g"(sizey),"g"(flags) + :"eax","ebx","ecx","edx"); +} + +//------------------------------------------------------------------------------------------ +// begin redraw window +//------------------------------------------------------------------------------------------ +extern inline void __attribute__((always_inline)) gui_ksys_begin_draw_window(void) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(12),"b"(1)); +} + +//------------------------------------------------------------------------------------------ +// finish redraw window +//------------------------------------------------------------------------------------------ +extern inline void __attribute__((always_inline)) gui_ksys_finish_draw_window(void) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(12),"b"(2)); +} + +//------------------------------------------------------------------------------------------ +// set new position and new size of window +//------------------------------------------------------------------------------------------ +extern inline void alwinline gui_ksys_set_position_and_size_window(DWORD new_x, + DWORD new_y,DWORD new_sizex,DWORD new_sizey) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(67),"b"(new_x),"c"(new_y),"d"(new_sizex),"S"(new_sizey)); +} + +//------------------------------------------------------------------------------------------ +// set title of window +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_set_title_window(char *title) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(71),"b"(1),"c"(title)); +} + +//------------------------------------------------------------------------------------------ +// delete title of window +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_delete_title_window(void) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(71),"b"(1),"c"(0)); +} + +//------------------------------------------------------------------------------------------ +// get information about current process +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_current_process_information(void *mem) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(9),"b"(mem),"c"(-1)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// delete title of window +//------------------------------------------------------------------------------------------ +extern inline int __attribute__((always_inline)) gui_ksys_get_skin_height(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(48),"b"(4)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get pressed key +//------------------------------------------------------------------------------------------ +extern inline int __attribute__((always_inline)) gui_ksys_get_key(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(2)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// set keyboard input mode +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_set_keyboard_input_mode(int mode) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(66),"b"(1),"c"(mode)); + +} + +//------------------------------------------------------------------------------------------ +// get keyboard input mode +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_keyboard_input_mode(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(66),"b"(2)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get state of menegers keys +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_state_menegers_keys(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(66),"b"(3)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// set events mask +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_set_events_mask(DWORD mask) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(40),"b"(mask)); +} + +//------------------------------------------------------------------------------------------ +// wait event +//------------------------------------------------------------------------------------------ +extern inline int __attribute__((always_inline)) gui_ksys_wait_event(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(10)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// check for event +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_check_event(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(11)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// wait event +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_wait_event_with_timeout(DWORD timeout) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(23),"b"(timeout)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get code of pressed button +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_code_pressed_button(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(17)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get window mouse coordinates +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_window_mouse_coordinates(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(37),"b"(1)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get screen mouse coordinates +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_screen_mouse_coordinates(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(37),"b"(0)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get mouse buttons state +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_mouse_buttons_state(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(37),"b"(2)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get mouse ruler state +//------------------------------------------------------------------------------------------ +extern inline int gui_ksys_get_mouse_ruler_state(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(37),"b"(7)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// put pixel in window +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_put_pixel_window(int x,int y,DWORD color) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(1),"b"(x),"c"(y),"d"(color)); +} + +//------------------------------------------------------------------------------------------ +// put image in window +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_put_image_window(char *p,int x,int y,int sizex,int sizey) +{ + __asm__ __volatile__( + "shll $16,%%ecx\n\t" + "shll $16,%%edx\n\t" + "addl %%esi,%%ecx\n\t" + "addl %%edi,%%edx\n\t" + "int $0x40" + :/*no output*/ + :"a"(7),"b"(p),"c"(sizex),"d"(x),"S"(sizey),"D"(y)); +} + +//------------------------------------------------------------------------------------------ +// draw filled rectangle in window +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_draw_filled_rectangle_window(int x,int y,int sizex,int sizey,DWORD color) +{ + __asm__ __volatile__( + "shll $16,%%ebx\n\t" + "shll $16,%%ecx\n\t" + "addl %%esi,%%ebx\n\t" + "addl %%edi,%%ecx\n\t" + "int $0x40" + :/*no output*/ + :"a"(13),"b"(x),"c"(y),"d"(color),"S"(sizex),"D"(sizey)); +} + +//------------------------------------------------------------------------------------------ +// get screen size +//------------------------------------------------------------------------------------------ +extern inline DWORD gui_ksys_get_screen_size(void) +{ + DWORD value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(14)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get color of pixel in coordinates (x,y) +//------------------------------------------------------------------------------------------ +extern inline DWORD gui_ksys_get_color_pixel_window(DWORD coordinates) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(35),"b"(coordinates)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// get bits per pixel on the screen +//------------------------------------------------------------------------------------------ +extern inline DWORD gui_ksys_get_screen_bits_per_pixel(void) +{ + int value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(61),"b"(2)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// draw line in window +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_draw_line_window(int x1,int y1,int x2,int y2,DWORD color) +{ + __asm__ __volatile__( + "shll $16,%%ebx\n\t" + "shll $16,%%ecx\n\t" + "addl %%esi,%%ebx\n\t" + "addl %%edi,%%ecx\n\t" + "int $0x40" + :/*no output*/ + :"a"(38),"b"(x1),"c"(y1),"d"(color),"S"(x2),"D"(y2)); +} + +//------------------------------------------------------------------------------------------ +// get standart colors table +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_get_standart_colors_table(char *buf) +{ + __asm__ __volatile__( + "int $0x40" + :/*no output*/ + :"a"(48),"b"(3),"c"(buf),"d"(40)); +} + +//------------------------------------------------------------------------------------------ +// get time from start system to current in 1/100 sec. +//------------------------------------------------------------------------------------------ +extern inline DWORD gui_ksys_get_ticks(void) +{ + DWORD value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(26),"b"(9)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// initialize heap of memory +//------------------------------------------------------------------------------------------ +extern inline DWORD gui_ksys_init_user_heap(void) +{ + DWORD value; + + __asm__ __volatile__( + "int $0x40" + :"=a"(value) + :"a"(68),"b"(11)); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// alloctae size bytes of user memory +//------------------------------------------------------------------------------------------ +extern inline void* gui_ksys_malloc(DWORD size) +{ + void *value; + + __asm__ __volatile__( + "int $0x40" :"=a"(value) + :"a"(68),"b"(12),"c"(size) + :"memory"); + + return(value); +} + +//------------------------------------------------------------------------------------------ +// free pointer of memory +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_free(void *mem) +{ + __asm__ __volatile__( + "int $0x40" + : + :"a"(68),"b"(13),"c"(mem) + :"memory"); +} + +//------------------------------------------------------------------------------------------ +// reallocate of memory +//------------------------------------------------------------------------------------------ +extern inline void* gui_ksys_realloc(DWORD new_size,void *old_mem) +{ + void *new_mem; + __asm__ __volatile__( + "int $0x40" + :"=a"(new_mem) + :"a"(68),"b"(20),"c"(new_size),"d"(old_mem) + :"memory"); + + return(new_mem); +} + + +//------------------------------------------------------------------------------------------ +// load user mode DLL +//------------------------------------------------------------------------------------------ +extern 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); +} + +//------------------------------------------------------------------------------------------ +// create thred +//------------------------------------------------------------------------------------------ +extern inline void* gui_ksys_create_thread(DWORD *thread_eip,DWORD *thread_esp) +{ + void *thread_TID; + + __asm__ __volatile__( + "int $0x40" + :"=a"(thread_TID) + :"a"(51),"b"(1),"c"(thread_eip),"d"(thread_esp) + :"memory"); + + return(thread_TID); +} + +//------------------------------------------------------------------------------------------ +// acces to files input output +//------------------------------------------------------------------------------------------ +extern inline DWORD gui_ksys_files_io(fileio_t *f,DWORD value) +{ + DWORD err_status; + + __asm__ __volatile__( + "int $0x40" + :"=a"(err_status),"=b"(value) + :"a"(70),"b"(f)); + + return(err_status); +} + +//------------------------------------------------------------------------------------------ +// debug board output +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_debug_out(int c) +{ + __asm__ __volatile__( + "int $0x40" + : + :"a"(63),"b"(1),"c"(c)); +} + +//------------------------------------------------------------------------------------------ +// KolibriOS system exit program +//------------------------------------------------------------------------------------------ +extern inline void gui_ksys_exit(int value) +{ + __asm__ __volatile__( + "int $0x40" + : + :"a"(-1),"b"(value)); +} + diff --git a/programs/develop/new libGUI_C/SRC/kolibri_system.inc b/programs/develop/new libGUI_C/SRC/kolibri_system.inc new file mode 100755 index 0000000000..24dcce0670 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/kolibri_system.inc @@ -0,0 +1,67 @@ +/* + some system function of KolibriOS and founded of them functions +*/ + +static DWORD gui_get_file_size(char *filename,DWORD *buf_for_size) +{ + static char buf[44]; + static fileio_t f; + bded_t *bded; + DWORD status,value; + + f.number_subfunction=5; + f.data=(DWORD*)buf; + f.full_file_path=filename; + + status=gui_ksys_files_io(&f,value); + + if (status==KOLIBRIOS_SYS_FILE_ACCESS_SUCCESSFULLY) + { + bded=(bded_t*)buf; + *buf_for_size=bded->file_size_low; + buf_for_size++; + *buf_for_size=bded->file_size_hight; + } + + return(status); +} + +static DWORD gui_read_file(char *filename,DWORD *buf_pos_size,DWORD size_read,char *buf) +{ + static fileio_t f; + DWORD status,value; + + f.number_subfunction=0; + f.offset_in_file_low=(DWORD)*buf_pos_size;buf_pos_size++; + f.offset_in_file_hight=(DWORD)*buf_pos_size; + f.size=size_read; + f.data=(DWORD*)buf; + f.full_file_path=filename; + + status=gui_ksys_files_io(&f,value); + + return(status); +} + +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 void* gui_cofflib_getproc(import_t *lib, char *name) +{ + int i; + + for(i = 0; lib[i].name && strcmp(name, lib[i].name); i++); + + if(lib[i].name) return lib[i].data; + else return NULL; +} + diff --git a/programs/develop/new libGUI_C/SRC/libGUI.c b/programs/develop/new libGUI_C/SRC/libGUI.c new file mode 100755 index 0000000000..d6bd503a10 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/libGUI.c @@ -0,0 +1,167 @@ +/* + libGUI dinamic library + (c) andrew_programmer 2009 + */ + +//service libGUI types of data,functions and constants +#include "types.h" +#include "libGUI.h" +#include "kolibri_system.h" +#include "draw_controls.h" +#include "fonts_meneger.h" +#include "keys.h" + +//controls +#include "control_button.h" +#include "control_image.h" +#include "control_progress_bar.h" +#include "control_scroll_bar.h" +#include "control_scrolled_window.h" +#include "control_text.h" + +//some libC functions +#include "stdarg.h" +#include "stdio.h" +#include "string.h" +#include "stdlib.h" + +#include "stdio.inc" +#include "string.inc" +#include "stdlib.inc" +#include "kolibri_system.inc" +#include "draw_controls.inc" +#include "fonts_meneger.inc" +#include "libGUI_menegement.inc" +#include "parent_window.inc" +#include "main_libGUI.inc" +#include "control_text.inc" +#include "control_image.inc" +#include "control_button.inc" +#include "control_progress_bar.inc" +#include "control_scroll_bar.inc" +#include "control_scrolled_window.inc" + + +typedef struct +{ + char *name; + void *function; +}export_t; + +//char szSTART[] = "START"; +char szLibGUIversion[] = "LibGUIversion"; +char szInitLibGUI[] = "InitLibGUI"; +char szLibGUImain[] = "LibGUImain"; +char szQuitLibGUI[] = "QuitLibGUI"; + +char szCreateWindow[] = "CreateWindow"; +char szSetWindowSizeRequest[] = "SetWindowSizeRequest"; + +char szPackControls[] = "PackControls"; +char szDestroyControl[] = "DestroyControl"; +char szSetControlSizeRequest[] = "SetControlSizeRequest"; +char szGetControlSizeX[] = "GetControlSizeX"; +char szGetControlSizeY[] = "GetControlSizeY"; +char szSetControlNewPosition[] = "SetControlNewPosition"; +char szGetControlPositionX[] = "GetControlPositionX"; +char szGetControlPositionY[] = "GetControlPositionY"; +char szSetFocuse[] = "SetFocuse"; +char szRedrawControl[] = "RedrawControl"; +char szSpecialRedrawControl[] = "SpecialRedrawControl"; + +char szSetCallbackFunction[] = "SetCallbackFunction"; +char szBlockCallbackFunction[] = "BlockCallbackFunction"; +char szUnblockCallbackFunction[] = "UnblockCallbackFunction"; + +char szSetIDL_Function[] = "SetIDL_Function"; +char szDestroyIDL_Function[] = "DestroyIDL_Function"; + +char szSetTimerCallbackForFunction[] = "SetTimerCallbackForFunction"; +char szDestroyTimerCallbackForFunction[] = "DestroyTimerCallbackForFunction"; + +char szSetCallbackFunctionForEvent[] = "SetCallbackFunctionForEvent"; +char szDestroyCallbackFunctionForEvent[] = "DestroyCallbackFunctionForEvent"; + +char szCreateButton[] = "CreateButton"; +char szCreateButtonWithText[] = "CreateButtonWithText"; + +char szCreateProgressBar[] = "CreateProgressBar"; +char szSetProgressBarPulse[] = "SetProgressBarPulse"; +char szProgressBarSetText[] = "ProgressBarSetText"; +char szProgressBarGetText[] = "ProgressBarGetText"; + +char szCreateHorizontalScrollBar[] = "CreateHorizontalScrollBar"; +char szCreateVerticalScrollBar[] = "CreateVerticalScrollBar"; + +char szCreateScrolledWindow[] = "CreateScrolledWindow"; +char szScrolledWindowPackControls[] = "ScrolledWindowPackControls"; + +char szCreateImage[] = "CreateImage"; + +char szCreateText[] = "CreateText"; +char szTextBackgroundOn[] = "TextBackgroundOn"; +char szTextBackgroundOff[] = "TextBackgroundOff"; + +char szLoadFont[] = "LoadFont"; +char szFreeFont[] = "FreeFont"; + +export_t EXPORTS[]__asm__("EXPORTS") = + { + {szLibGUIversion, LibGUIversion }, + {szInitLibGUI, InitLibGUI }, + {szLibGUImain, LibGUImain }, + {szQuitLibGUI, QuitLibGUI }, + + {szCreateWindow, CreateWindow }, + {szSetWindowSizeRequest, SetWindowSizeRequest }, + + {szPackControls, PackControls }, + {szDestroyControl, DestroyControl }, + {szSetControlSizeRequest, SetControlSizeRequest }, + {szGetControlSizeX, GetControlSizeX }, + {szGetControlSizeY, GetControlSizeY }, + {szSetControlNewPosition, SetControlNewPosition }, + {szGetControlPositionX, GetControlPositionX }, + {szGetControlPositionY, GetControlPositionY }, + {szSetFocuse, SetFocuse }, + {szRedrawControl, RedrawControl }, + {szSpecialRedrawControl, SpecialRedrawControl }, + + {szSetCallbackFunction, SetCallbackFunction }, + {szBlockCallbackFunction, BlockCallbackFunction }, + {szUnblockCallbackFunction, UnblockCallbackFunction }, + + {szSetIDL_Function, SetIDL_Function }, + {szDestroyIDL_Function, DestroyIDL_Function }, + + {szSetTimerCallbackForFunction, SetTimerCallbackForFunction }, + {szDestroyTimerCallbackForFunction, DestroyTimerCallbackForFunction }, + + {szSetCallbackFunctionForEvent, SetCallbackFunctionForEvent }, + {szDestroyCallbackFunctionForEvent, DestroyCallbackFunctionForEvent }, + + {szCreateButton, CreateButton }, + {szCreateButtonWithText, CreateButtonWithText }, + + {szCreateProgressBar, CreateProgressBar }, + {szSetProgressBarPulse, SetProgressBarPulse }, + {szProgressBarSetText, ProgressBarSetText }, + {szProgressBarGetText, ProgressBarGetText }, + + {szCreateHorizontalScrollBar, CreateHorizontalScrollBar }, + {szCreateVerticalScrollBar, CreateVerticalScrollBar }, + + {szCreateScrolledWindow, CreateScrolledWindow }, + {szScrolledWindowPackControls, ScrolledWindowPackControls }, + + {szCreateImage, CreateImage }, + + {szCreateText, CreateText }, + {szTextBackgroundOn, TextBackgroundOn }, + {szTextBackgroundOff, TextBackgroundOff }, + + {szLoadFont, LoadFont }, + {szFreeFont, FreeFont }, + + {NULL,NULL}, + }; diff --git a/programs/develop/new libGUI_C/SRC/libGUI.h b/programs/develop/new libGUI_C/SRC/libGUI.h new file mode 100755 index 0000000000..bc6e34cfb1 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/libGUI.h @@ -0,0 +1,580 @@ +/* + service structures of libGUI +*/ + +DWORD ID; + +//screen's parameters +#define BYTES_PER_PIXEL 4 + +//platform parameters +#define KOLIBRIOS 1 +//#define DEBUG + +//boolean constants +#define TRUE 0x1 +#define FALSE 0x0 + +//maximum callbacks for one check of callback +#define MAX_CALLBACKS 255 + +///////////////////////////////////////////////////////////////////////// +// libGUI sysyem messages types +///////////////////////////////////////////////////////////////////////// +#define MESSAGE_FULL_REDRAW_ALL 1 +#define MESSAGE_KEYS_EVENT 2 +#define MESSAGE_SPECIALIZED 3 +#define MESSAGE_SET_FOCUSE 4 +#define MESSAGE_CHANGE_FOCUSE 5 +#define MESSAGE_MOUSE_EVENT 6 +#define MESSAGE_CHANGE_POSITION_EVENT 7 +#define MESSAGE_CHANGESIZE_EVENT 8 +#define MESSAGE_CALL_TIMER_EVENT 9 +#define MESSAGE_FULL_REDRAW_ALL_WITH_FINITION 10 +#define MESSAGE_SET_MAIN_PARENT 11 +#define MESSAGE_DESTROY_CONTROL -1 + +///////////////////////////////////////////////////////////////////////// +// system flags of controls +///////////////////////////////////////////////////////////////////////// +#define FLAG_SHOW_CONTROL 0x1 +#define FLAG_HIDE_CONTROL 0xfffe +#define FLAG_FOCUSE_INPUT_SUPPOROTE 0x2 +#define FLAG_FOCUSE_INPUT_NOTSUPPOROTE 0xfffd +#define FLAG_FOCUSE_INPUT_ON 0x4 +#define FLAG_FOCUSE_INPUT_OFF 0xfffb +#define FLAG_CONNECT_EVENT_ON 0x8 +#define FLAG_CONNECT_EVENT_OFF 0xfff7 +#define FLAG_MOUSE_BLOCKED_ON 0x10 +#define FLAG_MOUSE_BLOCKED_OFF 0xffef +#define FLAG_GET_SPECIALIZED_MESSAGE_ON 0x20 +#define FLAG_GET_SPECIALIZED_MESSAGE_OFF 0xffdf + +///////////////////////////////////////////////////////////////////////// +// system flags of callback functions +///////////////////////////////////////////////////////////////////////// +#define FLAG_BLOCK_CALLBACK_ON 0x1 +#define FLAG_BLOCK_CALLBACK_OFF 0xfe + +///////////////////////////////////////////////////////////////////////// +// system flags of main wondow for timers +///////////////////////////////////////////////////////////////////////// +#define FLAG_TIMER_ON 0x1 +#define FLAG_TIMER_OFF 0xfe + +///////////////////////////////////////////////////////////////////////// +// system keys states +///////////////////////////////////////////////////////////////////////// +#define KEY_DOWN 16 +#define KEY_UP 17 +#define KEY_HOTKEY 18 +///////////////////////////////////////////////////////////////////////// +// system mouse buttons states +///////////////////////////////////////////////////////////////////////// +#define MOUSE_LEFT_BUTTON_DOWN 19 +#define MOUSE_LEFT_BUTTON_UP 20 +#define MOUSE_RIGHT_BUTTON_DOWN 21 +#define MOUSE_RIGHT_BUTTON_UP 22 +#define MOUSE_MIDDLE_BUTTON_DOWN 23 +#define MOUSE_MIDDLE_BUTTON_UP 24 +#define MOUSE_4_BUTTON_DOWN 25 +#define MOUSE_4_BUTTON_UP 26 +#define MOUSE_5_BUTTON_DOWN 27 +#define MOUSE_5_BUTTON_UP 28 + + +///////////////////////////////////////////////////////////////// +// CONNECT EVENTS FOR CALLBACKs +///////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////// +// connect events for button +//////////////////////////////////////////////////////////////// +#define BUTTON_ENTER_EVENT 29 +#define BUTTON_LEAVE_EVENT 30 +#define BUTTON_PRESSED_EVENT 31 +#define BUTTON_RELEASED_EVENT 32 + +//////////////////////////////////////////////////////////////// +// connect events for button +//////////////////////////////////////////////////////////////// +#define SCROLLBAR_CHANGED_EVENT 33 + +//////////////////////////////////////////////////////////////// +// connect events for main parent window +//////////////////////////////////////////////////////////////// +#define DELETE_EVENT 36 + +//////////////////////////////////////////////////////////////////// +//screen buffer parameters +//////////////////////////////////////////////////////////////////// +#define DRAW_OUTPUT_SCREEN 0 +#define DRAW_OUTPUT_BUFFER 1 + +static struct +{ + char *buffer; + char bits_per_pixel; + char bytes_per_pixel; + char draw_output; + int x; + int y; + int size_x; + int size_y; + int skin_height; + int display_size_x; + int display_size_y; +}screen; + +//////////////////////////////////////////////////////////////// +// header of parent of control +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct HEADERPARENT +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + DWORD **control_for_callback_function; + DWORD **callback_for_control_callback; + DWORD number_callbacks; + DWORD *global_active_control_for_keys; + DWORD *message; + DWORD *timer_bk; + DWORD *timer_fd; + DWORD number_timers_for_controls; + DWORD *calev_bk; + DWORD *calev_fd; + DWORD *IDL_func; + DWORD *IDL_func_data; +}; +#pragma pack(pop) + +typedef struct HEADERPARENT parent_t; + +//////////////////////////////////////////////////////////////// +// header of control +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct HEADER +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct HEADER header_t; +//////////////////////////////////////////////////////////////// +// callback structure for callback function of control +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct CALLBACK +{ + DWORD *clb_bk; + DWORD *clb_fd; + DWORD *clb_control; + DWORD *func; + DWORD *func_data; + DWORD connect_event; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct CALLBACK gui_callback_t; +//////////////////////////////////////////////////////////////// +// timer +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct TIMER +{ + DWORD *tmr_bk; + DWORD *tmr_fd; + DWORD *tmr_parent; + DWORD *func; + DWORD *func_data; + DWORD last_time; + DWORD time_tick; + DWORD flags; +}; +#pragma pack(pop) + +typedef struct TIMER gui_timer_t; +//////////////////////////////////////////////////////////////// +// structure for callback events +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct CALLBACKEVENT +{ + DWORD *calev_bk; + DWORD *calev_fd; + DWORD *calev_parent; + DWORD *func; + DWORD *func_data; + DWORD event_type; +}; +#pragma pack(pop) + +typedef struct CALLBACKEVENT gui_callbackevent_t; +//////////////////////////////////////////////////////////////// +// structure for callback events +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct FINITION +{ + DWORD x; + DWORD y; + DWORD sizex; + DWORD sizey; + char flags; +}; +#pragma pack(pop) + +typedef struct FINITION finition_t; +//////////////////////////////////////////////////////////////// +// type of data - structure message +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct MESSAGE +{ + DWORD type; + DWORD arg1; + DWORD arg2; + DWORD arg3; + DWORD arg4; +}; +#pragma pack(pop) + +typedef struct MESSAGE gui_message_t; +//////////////////////////////////////////////////////////////// +// prototype of functions +//////////////////////////////////////////////////////////////// +void (*ControlProc)(void *Control,gui_message_t *message); +void (*CallbackFunction)(header_t *Control,void *data); +void (*TimerCallbackFunction)(void *data); +void (*CallbackFunctionForEvent)(gui_message_t *message,void *data); +void (*IDL_Function)(void *data); + +//////////////////////////////////////////////////////////////// +// button +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlButton +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //button's data + unsigned char btn_flags; +}; +#pragma pack(pop) + +typedef struct ControlButton gui_button_t; +// information for creating control Button +#pragma pack(push,1) +struct ButtonData +{ + int x; + int y; + int width; + int height; +}; +#pragma pack(pop) + +typedef struct ButtonData gui_button_data_t; +//////////////////////////////////////////////////////////////// +// scroller +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlScrollBar +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //scroll bar's data + float ruller_size; + float ruller_pos; + float ruller_step; + unsigned char scb_flags; +}; +#pragma pack(pop) + +typedef struct ControlScrollBar gui_scroll_bar_t; + +#pragma pack(push,1) +struct ScrollBarData +{ + int x; + int y; + int width; + int height; + float ruller_size; + float ruller_pos; + float ruller_step; +}; +#pragma pack(pop) + +typedef struct ScrollBarData gui_scroll_bar_data_t; +//////////////////////////////////////////////////////////////// +// progressbar +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlProgressBar +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //progress bar's data + float progress; + unsigned char prb_flags; +}; +#pragma pack(pop) + +typedef struct ControlProgressBar gui_progress_bar_t; + +#pragma pack(push,1) +struct ProgressBarData +{ + int x; + int y; + int width; + int height; + float progress; +}; +#pragma pack(pop) + +typedef struct ProgressBarData gui_progress_bar_data_t; +//////////////////////////////////////////////////////////////// +// scrolled window +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlScrolledWindow +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + //scrolled windows's data + DWORD virtual_x; + DWORD virtual_y; + DWORD virtual_sizex; + DWORD virtual_sizey; + DWORD *virtual_controls_x; + DWORD *virtual_controls_y; + DWORD number_virtual_controls; + DWORD scroll_arrea_sizex; + DWORD scroll_arrea_sizey; + DWORD *horizontal_scroll; + DWORD *vertical_scroll; + unsigned char scw_flags; +}; +#pragma pack(pop) + +typedef struct ControlScrolledWindow gui_scrolled_window_t; + +#pragma pack(push,1) +struct ScrolledWindowData +{ + int x; + int y; + int width; + int height; +}; +#pragma pack(pop) + +typedef struct ScrolledWindowData gui_scrolled_window_data_t; + +//////////////////////////////////////////////////////////////// +// image +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlImage +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + char bits_per_pixel; + char bytes_per_pixel; + char *img; +}; +#pragma pack(pop) + +typedef struct ControlImage gui_image_t; + +#pragma pack(push,1) +struct ImageData +{ + int x; + int y; + int width; + int height; + char bits_per_pixel; +}; +#pragma pack(pop) + +typedef struct ImageData gui_image_data_t; + +//////////////////////////////////////////////////////////////// +// text +//////////////////////////////////////////////////////////////// +#pragma pack(push,1) +struct ControlText +{ + DWORD *ctrl_proc; + DWORD *ctrl_fd; + DWORD *ctrl_bk; + DWORD *child_fd; + DWORD *child_bk; + DWORD *parent; + DWORD *main_parent; + DWORD ctrl_x; + DWORD ctrl_y; + DWORD ctrl_sizex; + DWORD ctrl_sizey; + DWORD ctrl_ID; + DWORD *active_control_for_keys; + DWORD *active_control_for_mouse; + DWORD *callback; + DWORD *finition; + DWORD *timer; + DWORD flags; + + DWORD *font; + DWORD color; + DWORD background_color; + char *text; + BYTE txt_flags; +}; +#pragma pack(pop) + +typedef struct ControlText gui_text_t; + +#pragma pack(push,1) +struct TextData +{ + int x; + int y; + DWORD *font; + DWORD color; + DWORD background_color; + char background; + char *text; +}; +#pragma pack(pop) + +typedef struct TextData gui_text_data_t; +///////////////////////////////////////////////////////////////////////////// +// prototips of some service functions +///////////////////////////////////////////////////////////////////////////// + +char CheckCrossRectangles(int x1,int y1,int sizex1,int sizey1,int x2,int y2,int sizex2,int sizey2); diff --git a/programs/develop/new libGUI_C/SRC/libGUI_menegement.inc b/programs/develop/new libGUI_C/SRC/libGUI_menegement.inc new file mode 100755 index 0000000000..a2070a6ef6 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/libGUI_menegement.inc @@ -0,0 +1,1642 @@ +/* + libGUI main part of code +*/ + +//--------------------------------------------------------------------------------- +// destroy_control for libGUI +//--------------------------------------------------------------------------------- +void DestroyControl(void *control_ptr) +{ + struct HEADER *Parent; + struct HEADER *control; + struct HEADER *seek_control; + struct HEADER *exchange_control; + struct HEADER *last_control; + struct HEADER *next_control; + + if (control_ptr==NULL) return; + + control=control_ptr; + Parent=(struct HEADER *)control->parent; + + if (Parent->child_bk==Parent->child_fd) + { + //parent have got alone child control + if (Parent->child_bk==(DWORD*)control) + { + //current control is child control of parent +#ifdef DEBUG + printf("\ndestroyed control=%d parent=%d ID=%d",(int)control,(int)Parent,(int)control->ctrl_ID); +#endif + free(control); + Parent->child_bk=(DWORD*)NULL; + Parent->child_fd=(DWORD*)NULL; + } + return; + } + + seek_control=(struct HEADER*)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control==control) + { + //delete control from control's stack + last_control=(struct HEADER*)seek_control->ctrl_bk; + next_control=(struct HEADER*)seek_control->ctrl_fd; + + if ((last_control!=Parent) && (next_control!=NULL)) + {//deliting control isn't first control and isn't endest of parent + next_control->ctrl_bk=(DWORD*)last_control; + last_control->ctrl_fd=(DWORD*)next_control; + } + else + { + if (last_control==Parent) + {//deliting control is first control of Parend + Parent->child_bk=(DWORD*)next_control; + next_control->ctrl_bk=(DWORD*)Parent; + if (next_control->ctrl_fd==(DWORD*)NULL) + { + Parent->child_fd=(DWORD*)next_control; + Parent->child_bk=(DWORD*)next_control; + } + } + + if (next_control==(struct HEADER*)NULL) + { + //there isn't next controls + last_control->ctrl_fd=(DWORD*)NULL; + Parent->ctrl_fd=(DWORD*)last_control; + } + } +#ifdef DEBUG + printf("\ndestroyed control=%d parent=%d ID=%d",(int)control,(int)Parent,(int)control->ctrl_ID); +#endif + free(control); + break; + } + exchange_control=(struct HEADER*)seek_control->ctrl_fd; + seek_control=exchange_control; + } +} + +//--------------------------------------------------------------------------------- +// create new timer for parent window +//--------------------------------------------------------------------------------- +void *CreateTimerForParentWindow(parent_t *parent) +{ + struct TIMER *timer; + struct TIMER *backward_timer; + + timer=malloc(sizeof(struct TIMER)); + timer->tmr_parent=(DWORD*)parent; + + if (parent->timer_bk==(DWORD*)NULL) + {//not yet timers + parent->timer_bk=(DWORD*)timer; + parent->timer_fd=(DWORD*)timer; + timer->tmr_bk=(DWORD*)parent; + timer->tmr_fd=(DWORD*)NULL; + } + else + { + backward_timer=(struct TIMER*)parent->timer_fd; + parent->timer_fd=(DWORD*)timer; + backward_timer->tmr_fd=(DWORD*)timer; + timer->tmr_bk=(DWORD*)backward_timer; + timer->tmr_fd=(DWORD*)NULL; + } + return(timer); +} + +//--------------------------------------------------------------------------------- +// destroy timer for parent window +//--------------------------------------------------------------------------------- +void DestroyTimerCallbackForFunction(struct TIMER *timer) +{ + struct HEADERPARENT *Parent; + struct TIMER *seek_timer; + struct TIMER *exchange_timer; + struct TIMER *last_timer; + struct TIMER *next_timer; + + if (timer==(struct TIMER*)NULL) return; + + Parent=(struct HEADERPARENT *)timer->tmr_parent; + + if (Parent->timer_bk==Parent->timer_fd) + { + //parent have got alone timer + if (Parent->timer_bk==(DWORD*)timer) + { + Parent->timer_bk=(DWORD*)NULL; + Parent->timer_fd=(DWORD*)NULL; +#ifdef DEBUG + printf("\ndestroyed timer %d parent window %d",(int)timer,(int)timer->tmr_parent); +#endif + free(timer); + return; + } + return; + } + + seek_timer=(struct TIMER*)Parent->timer_bk; + while(seek_timer!=(struct TIMER*)NULL) + { + if (seek_timer==timer) + { + //delete timer from timers's stack + last_timer=(struct TIMER*)seek_timer->tmr_bk; + next_timer=(struct TIMER*)seek_timer->tmr_fd; + + if ((last_timer!=(struct TIMER*)Parent) && (next_timer!=(struct TIMER*)NULL)) + {//deliting timer isn't first timer and isn't endest + next_timer->tmr_bk=(DWORD*)last_timer; + last_timer->tmr_fd=(DWORD*)next_timer; + } + else + { + if (last_timer==(struct TIMER*)Parent) + {//deliting timer is first timer of Parend + Parent->timer_bk=(DWORD*)next_timer; + next_timer->tmr_bk=(DWORD*)Parent; + if (next_timer->tmr_fd==(DWORD*)NULL) + { + Parent->timer_fd=(DWORD*)next_timer; + Parent->timer_bk=(DWORD*)next_timer; + } + } + + if (next_timer==(struct TIMER*)NULL) + { + //there isn't next controls + last_timer->tmr_fd=(DWORD*)NULL; + Parent->timer_fd=(DWORD*)last_timer; + } + } +#ifdef DEBUG + printf("\ndestroyed timer %d parent window %d",(int)timer,(int)timer->tmr_parent); +#endif + free(timer); + break; + } + exchange_timer=(struct TIMER*)seek_timer->tmr_fd; + seek_timer=exchange_timer; + } +} + +//--------------------------------------------------------------------------------- +// create timer for function of parent window +//--------------------------------------------------------------------------------- +void *SetTimerCallbackForFunction(parent_t *parent_window,int time_tick,void *func,void *func_data) +{ + struct TIMER *timer; + + timer=CreateTimerForParentWindow(parent_window); + timer->func=(DWORD*)func; + timer->func_data=(DWORD*)func_data; + timer->time_tick=(DWORD)time_tick; + timer->last_time=gui_ksys_get_ticks(); + timer->flags=timer->flags | FLAG_TIMER_ON; + + return(timer); +} + +//--------------------------------------------------------------------------------- +// create timer for callback +//--------------------------------------------------------------------------------- +void *SetTimerCallbackForControl(int time_tick,void *func,void *func_data) +{ + struct TIMER *timer; + + timer=malloc(sizeof(struct TIMER)); + timer->func=(DWORD*)func; + timer->func_data=(DWORD*)func_data; + timer->time_tick=(DWORD)time_tick; + timer->last_time=gui_ksys_get_ticks(); + timer->flags=timer->flags & FLAG_TIMER_OFF; + + return(timer); +} + +//--------------------------------------------------------------------------------- +// call timer +//--------------------------------------------------------------------------------- +void Timer(struct TIMER *timer) +{ + DWORD time,delta_time; + + time=gui_ksys_get_ticks(); + delta_time=time-timer->last_time; + if (delta_time>=timer->time_tick) + { + TimerCallbackFunction=(void(*)(void *data))timer->func; + TimerCallbackFunction(timer->func_data); + timer->last_time=gui_ksys_get_ticks(); + } +} + +//--------------------------------------------------------------------------------- +// create new callback for event +//--------------------------------------------------------------------------------- +void *CreateCallbackForEvent(parent_t *parent) +{ + gui_callbackevent_t *calev; + gui_callbackevent_t *backward_calev; + + calev=malloc(sizeof(gui_callbackevent_t)); + calev->calev_parent=(DWORD*)parent; + + if (parent->calev_bk==(DWORD*)NULL) + {//not yet timers + parent->calev_bk=(DWORD*)calev; + parent->calev_fd=(DWORD*)calev; + calev->calev_bk=(DWORD*)parent; + calev->calev_fd=(DWORD*)NULL; + } + else + { + backward_calev=(gui_callbackevent_t*)parent->calev_fd; + parent->calev_fd=(DWORD*)calev; + backward_calev->calev_fd=(DWORD*)calev; + calev->calev_bk=(DWORD*)backward_calev; + calev->calev_fd=(DWORD*)NULL; + } + return(calev); +} + +//--------------------------------------------------------------------------------- +// destroy callback function for eventcalev +//--------------------------------------------------------------------------------- +void DestroyCallbackFunctionForEvent(gui_callbackevent_t *calev) +{ + struct HEADERPARENT *Parent; + struct CALLBACKEVENT *seek_calev; + struct CALLBACKEVENT *exchange_calev; + struct CALLBACKEVENT *last_calev; + struct CALLBACKEVENT *next_calev; + + if (calev==(gui_callbackevent_t*)NULL) return; + + Parent=(parent_t*)calev->calev_parent; + + if (Parent->calev_bk==Parent->calev_fd) + { + //parent have got alone timer + if (Parent->calev_bk==(DWORD*)calev) + { + free(calev); + Parent->calev_bk=(DWORD*)NULL; + Parent->calev_fd=(DWORD*)NULL; + } + return; + } + + seek_calev=(struct CALLBACKEVENT*)Parent->calev_bk; + while(seek_calev!=(struct CALLBACKEVENT*)NULL) + { + if (seek_calev==calev) + { + //delete timer from timers's stack + last_calev=(struct CALLBACKEVENT*)seek_calev->calev_bk; + next_calev=(struct CALLBACKEVENT*)seek_calev->calev_fd; + + if ((last_calev!=(struct CALLBACKEVENT*)Parent) && (next_calev!=(struct CALLBACKEVENT*)NULL)) + {//deliting timer isn't first timer and isn't endest + next_calev->calev_bk=(DWORD*)last_calev; + last_calev->calev_fd=(DWORD*)next_calev; + } + else + { + if (last_calev==(struct CALLBACKEVENT*)Parent) + {//deliting timer is first timer of Parend + Parent->calev_bk=(DWORD*)next_calev; + next_calev->calev_bk=(DWORD*)Parent; + if (next_calev->calev_fd==(DWORD*)NULL) + { + Parent->calev_fd=(DWORD*)next_calev; + Parent->calev_bk=(DWORD*)next_calev; + } + } + + if (next_calev==(struct CALLBACKEVENT*)NULL) + { + //there isn't next controls + last_calev->calev_fd=(DWORD*)NULL; + Parent->calev_fd=(DWORD*)last_calev; + } + } + free(calev); + break; + } + exchange_calev=(struct CALLBACKEVENT*)seek_calev->calev_fd; + seek_calev=exchange_calev; + } +} + +//--------------------------------------------------------------------------------- +// create callback for messenger of events +//--------------------------------------------------------------------------------- +void *SetCallbackFunctionForEvent(parent_t *parent_window,int event_type,void *func,void *func_data) +{ + gui_callbackevent_t *calev; + + calev=CreateCallbackForEvent(parent_window); + calev->func=(DWORD*)func; + calev->func_data=(DWORD*)func_data; + calev->event_type=(DWORD)event_type; + + return(calev); +} + +//--------------------------------------------------------------------------------- +// check cross control and mouse +//--------------------------------------------------------------------------------- +char CheckCrossBox(struct HEADER *control,int mouse_x,int mouse_y) +{ + struct FINITION *fin; + int x,y,x2,y2; + int xmin,xmax,ymin,ymax,sx,sy; + + fin=(struct FINITION*)control->finition; + + if (fin->flags & FINITION_ON) + { + xmin=fin->x; + xmax=fin->x+fin->sizex-1; + ymin=fin->y; + ymax=fin->y+fin->sizey-1; + + x=control->ctrl_x; + y=control->ctrl_y; + x2=x+control->ctrl_sizex-1; + y2=y+control->ctrl_sizey-1; + + if (x2xmax) return(FALSE); + if (y2ymax) return(FALSE); + + //finit x coordinates and sizex + sx=x-xmin; + + if (sx>=0) + { + if (x2>xmax) x2=xmax; + } + else + { + x=xmin; + if (x2>xmax) x2=xmax; + } + + //finit y coordinates and sizey + sy=y-ymin; + + if (sy>=0) + { + if (y2>ymax) y2=ymax; + } + else + { + y=ymin; + if (y2>ymax) y2=ymax; + } + //check cross finited control with mouse + if ((mouse_x>=x) && (mouse_x<=x2) && (mouse_y>=y) && (mouse_y<=y2)) + return(TRUE); + else + return(FALSE); + } + else + { + if ((mouse_x>=control->ctrl_x) && (mouse_x<=control->ctrl_x+control->ctrl_sizex) && + (mouse_y>=control->ctrl_y) && (mouse_y<=control->ctrl_y+control->ctrl_sizey)) + return(TRUE); + else + return(FALSE); + } +} + +//--------------------------------------------------------------------------------- +// check cross two rectaangles +//--------------------------------------------------------------------------------- +char CheckCrossRectangles(int x1,int y1,int sizex1,int sizey1,int x2,int y2,int sizex2,int sizey2) +{ + int s; + int xmax,ymax; + + xmax=x1+sizex1-1; + ymax=y1+sizey1-1; + + //check x cross + s=x2-x1; + if (s>0) + {//second rectangle have right position + if (x2>xmax) return(FALSE); + } + if (s<0) + {//second rectangle have left position + s=-s; + if (s>=sizex2) return(FALSE); + } + + //check y cross + s=y2-y1; + if (s>0) + {//second rectangle have down position + if (y2>ymax) return(FALSE); + } + if (s<0) + {//second rectangle have up position + s=-s; + if (s>=sizey2) return(FALSE); + } + return(TRUE); +} + +//--------------------------------------------------------------------------------- +// check full cross two rectaangles +//--------------------------------------------------------------------------------- +char CheckFullCrossRectangles(int x1,int y1,int sizex1,int sizey1,int x2,int y2,int sizex2,int sizey2) +{ + int s; + int xmax,ymax; + + xmax=x1+sizex1-1; + ymax=y1+sizey1-1; + + if (x2>=x1 && x2+sizex2-1<=xmax && y2>=y1 && y2+sizey2-1<=ymax) return(TRUE); + else return(FALSE); +} + +//--------------------------------------------------------------------------------- +// send message to controls +//--------------------------------------------------------------------------------- +void SendMessage(struct HEADER *Parent,struct MESSAGE *message) +{ + struct HEADER *seek_control; + struct HEADER *exchange_control; + struct HEADER *parent; + struct HEADERPARENT *main_parent; + struct MESSAGE local_service_message; + struct HEADER *active_control_for_keys; + struct HEADER *active_control_for_mouse; + char cross; + + //Parent haven't got child controls + if ((Parent->child_bk==NULL) && (Parent->child_fd==NULL)) return; + + //load main parent + main_parent=(struct HEADERPARENT*)Parent->main_parent; + + //load active controls from Parent + active_control_for_keys=(struct HEADER*)Parent->active_control_for_keys; + active_control_for_mouse=(struct HEADER*)Parent->active_control_for_mouse; + + //Parent have got alon child control + if (Parent->child_bk==Parent->child_fd) + { + seek_control=(struct HEADER *)Parent->child_bk; + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //send message redraw to all child controls + if (seek_control->flags & FLAG_SHOW_CONTROL) ControlProc(seek_control,message); + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + //send message finited redraw to all child controls + if (seek_control->flags & FLAG_SHOW_CONTROL) ControlProc(seek_control,message); + break; + } + case MESSAGE_KEYS_EVENT: + { //change active control for keyboard by TAB press + if ((message->arg1==KEY_DOWN) && (message->arg2==SC_TAB)) + { + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + if (active_control_for_keys==seek_control) + {//focuse of input set for current control + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc; + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + local_service_message.arg1=FALSE; + active_control_for_keys->flags=active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + + parent=(struct HEADER*)active_control_for_keys->parent; + + seek_control=parent; + do + { + if (parent==(struct HEADER*)main_parent) break; + //if next control NULL go to parent + if (seek_control==(struct HEADER*)NULL) seek_control=parent; + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + if (seek_control==(struct HEADER*)NULL) + parent=(struct HEADER*)parent->parent; + } + while((seek_control==(struct HEADER*)NULL) || + ((seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)==FALSE)); + + if (parent==(struct HEADER*)main_parent) + { + //find first control of main parent with focuse of input supporote + seek_control=(struct HEADER *)main_parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) break; + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + main_parent->active_control_for_keys=(DWORD*)seek_control; + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + + //send message enable focuse of input to control + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + local_service_message.arg1=FALSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=(struct HEADER*)NULL; + break; + } + if (seek_control!=(struct HEADER*)NULL) + { + parent=(struct HEADER*)seek_control->parent; + parent->active_control_for_keys=(DWORD*)seek_control; + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + + //send message enable focuse of input to control + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + local_service_message.arg1=FALSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=(struct HEADER*)NULL; + Parent->active_control_for_keys=(DWORD*)active_control_for_keys; + break; + } + } + else + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + local_service_message.arg1=FALSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=seek_control; + Parent->active_control_for_keys=(DWORD*)active_control_for_keys; + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + } + } + } + + //send message of keys only to active control + if (active_control_for_keys!=NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc; + ControlProc(active_control_for_keys,message); + } + break; + } + case MESSAGE_SPECIALIZED: + { + //send specialized message to all child controls + ControlProc(seek_control,message); + break; + } + case MESSAGE_MOUSE_EVENT: + { + if (seek_control->flags & FLAG_MOUSE_BLOCKED_ON) break; + + if (message->arg3==MOUSE_LEFT_BUTTON_DOWN) + { + if (active_control_for_mouse!=NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_mouse->ctrl_proc; + ControlProc(active_control_for_mouse,message); + break; + } + } + else + { + if (active_control_for_mouse!=NULL) {active_control_for_mouse=NULL;} + } + + cross=FALSE; + if (CheckCrossBox(seek_control,message->arg1,message->arg2)==TRUE) + { + if (message->arg3==MOUSE_LEFT_BUTTON_DOWN) + { + cross=TRUE; + active_control_for_mouse=seek_control; + + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + parent=(struct HEADER*)seek_control->parent; + if (parent->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + active_control_for_keys=(struct HEADER*)main_parent->global_active_control_for_keys; + if (active_control_for_keys!=(struct HEADER*)NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + active_control_for_keys->ctrl_proc; + + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + active_control_for_keys->flags= + active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + } + + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + Parent->active_control_for_keys=(DWORD*)seek_control; + } + } + } + } + + if ((cross==FALSE) && (message->arg3==MOUSE_LEFT_BUTTON_DOWN)) + { + if (active_control_for_keys!=NULL) + {//disable focuse of input for active control of keys + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc; + + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + active_control_for_keys->flags=active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + } + } + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + ControlProc(seek_control,message); + break; + } + case MESSAGE_CALL_TIMER_EVENT: + { + ControlProc(seek_control,message); + break; + } + case MESSAGE_DESTROY_CONTROL: + { + //send message to control for destroing child controls + ControlProc(seek_control,message); + DestroyControl(seek_control); + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + ControlProc(seek_control,message); + break; + } + default:break; + } + } + else + { + switch(message->type) + { + case MESSAGE_FULL_REDRAW_ALL: + { + //send message redraw to all child controls of Parent + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_SHOW_CONTROL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + } + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION: + { + //send message redraw to all child controls of Parent + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_SHOW_CONTROL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + } + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_KEYS_EVENT: + { + if ((message->arg1==KEY_DOWN) && (message->arg2==SC_TAB)) + { //change active control for keyboard by TAB press + if (active_control_for_keys==NULL) + { + seek_control=(struct HEADER *)Parent->child_bk; + + if ((seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)==FALSE) + { //find first control of parend with supporote of input + while(seek_control->ctrl_fd!=(DWORD*)NULL) + { + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + active_control_for_keys=seek_control; + main_parent->global_active_control_for_keys= + (DWORD*)active_control_for_keys; + Parent->active_control_for_keys=(DWORD*)active_control_for_keys; + break; + } + } + if (active_control_for_keys!=NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + } + } + else + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=seek_control; + main_parent->global_active_control_for_keys=(DWORD*)active_control_for_keys; + Parent->active_control_for_keys=(DWORD*)active_control_for_keys; + } + } + else + { + if (active_control_for_keys==(struct HEADER*)main_parent->global_active_control_for_keys) + { + seek_control=active_control_for_keys; + while(seek_control!=(struct HEADER*)NULL) + { + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + + if (seek_control==(struct HEADER*)NULL) + { //send message disable focuse of input to current control + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + active_control_for_keys->ctrl_proc; + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + active_control_for_keys->flags= + active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + + //back into main parent of tree and find next not NULL control + parent=(struct HEADER*)active_control_for_keys->parent; + do + { + if (parent==(struct HEADER*)main_parent) break; + + //if next control NULL go to parent + if (seek_control==(struct HEADER*)NULL) seek_control=parent; + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + if (seek_control==(struct HEADER*)NULL) + parent=(struct HEADER*)parent->parent; + + } + while((seek_control==(struct HEADER*)NULL) || + ((seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE)==FALSE)); + + if (parent==(struct HEADER*)main_parent) + { + //find first control of main parent with focuse of input supporote + seek_control=(struct HEADER *)main_parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + break; + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + + main_parent->active_control_for_keys=(DWORD*)seek_control; + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + + //send message enable focuse of input to control + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=(struct HEADER*)NULL; + break; + + } + if (seek_control!=(struct HEADER*)NULL) + { + parent=(struct HEADER*)seek_control->parent; + parent->active_control_for_keys=(DWORD*)seek_control; + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + + //send message enable focuse of input to control + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=(struct HEADER*)NULL; + Parent->active_control_for_keys=(DWORD*)active_control_for_keys; + break; + } + } + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + active_control_for_keys->ctrl_proc; + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + active_control_for_keys->flags= + active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=seek_control; + main_parent->global_active_control_for_keys= + (DWORD*)active_control_for_keys; + Parent->active_control_for_keys=(DWORD*)active_control_for_keys; + break; + } + } + } + } + } + + //send message of keys only to active control + if (active_control_for_keys!=NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc; + ControlProc(active_control_for_keys,message); + } + break; + } + case MESSAGE_SPECIALIZED: + { + //send specialized message to all child controls + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_MOUSE_EVENT: + { + if (message->arg3==MOUSE_LEFT_BUTTON_DOWN) + { + if (active_control_for_mouse!=NULL) + { + if (active_control_for_mouse->flags & FLAG_MOUSE_BLOCKED_ON) break; + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_mouse->ctrl_proc; + ControlProc(active_control_for_mouse,message); + break; + } + } + else + { + if (active_control_for_mouse!=NULL) {active_control_for_mouse=NULL;} + } + + cross=FALSE; + seek_control=(struct HEADER*)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (CheckCrossBox(seek_control,message->arg1,message->arg2)==TRUE && + (seek_control->flags & FLAG_MOUSE_BLOCKED_ON)==FALSE) + { + if (message->arg3==MOUSE_LEFT_BUTTON_DOWN) + { + cross=TRUE; + active_control_for_mouse=seek_control; + + if (active_control_for_mouse->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + //set focuse of input for new active control + active_control_for_mouse->flags=active_control_for_mouse->flags | FLAG_FOCUSE_INPUT_ON; + + if (active_control_for_keys!=NULL) + { + if (active_control_for_keys!=seek_control) + { + //check seek control for supporote focuse of input + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + //check parent for supporote focuse of input + parent=(struct HEADER*)seek_control->parent; + if (parent->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + active_control_for_keys->ctrl_proc; + + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + local_service_message.arg1=FALSE; + active_control_for_keys->flags= + active_control_for_keys->flags & + FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + local_service_message.arg1=FALSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + active_control_for_keys=seek_control; + main_parent->global_active_control_for_keys= + (DWORD*)active_control_for_keys; + Parent->active_control_for_keys= + (DWORD*)active_control_for_keys; + } + } + } + } + else + { + //check seek control for supporote focuse of input + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + //check parent for supporote focuse of input + parent=(struct HEADER*)seek_control->parent; + if (parent->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + active_control_for_keys=(struct HEADER*)main_parent->global_active_control_for_keys; + if (active_control_for_keys!=NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + active_control_for_keys->ctrl_proc; + + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + active_control_for_keys->flags= + active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + } + + ControlProc=(void (*)(void *Control,struct MESSAGE *message)) + seek_control->ctrl_proc; + local_service_message.type=MESSAGE_SET_FOCUSE; + seek_control->flags=seek_control->flags | FLAG_FOCUSE_INPUT_ON; + ControlProc(seek_control,&local_service_message); + + main_parent->global_active_control_for_keys=(DWORD*)seek_control; + Parent->active_control_for_keys=(DWORD*)seek_control; + } + } + } + } + } + } + + if ((seek_control->flags & FLAG_MOUSE_BLOCKED_ON)==FALSE) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + } + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + + if ((cross==FALSE) && (message->arg3==MOUSE_LEFT_BUTTON_DOWN)) + { + if (active_control_for_keys!=NULL) + {//disable focuse of input for active control of keys + ControlProc=(void (*)(void *Control,struct MESSAGE *message))active_control_for_keys->ctrl_proc; + + local_service_message.type=MESSAGE_CHANGE_FOCUSE; + active_control_for_keys->flags=active_control_for_keys->flags & FLAG_FOCUSE_INPUT_OFF; + ControlProc(active_control_for_keys,&local_service_message); + + main_parent->global_active_control_for_keys=(DWORD*)NULL; + Parent->active_control_for_keys=(DWORD*)NULL; + } + } + + break; + } + case MESSAGE_CHANGE_POSITION_EVENT: + { + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_CALL_TIMER_EVENT: + { + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_SET_FOCUSE: + { + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + break; + } + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_CHANGE_FOCUSE: + { + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + if (seek_control->flags & FLAG_FOCUSE_INPUT_SUPPOROTE) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + ControlProc(seek_control,message); + break; + } + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + case MESSAGE_DESTROY_CONTROL: + { + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { //befor delet control get next control of parent + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + //send message to control for destroyng child controls + ControlProc(seek_control,message); + DestroyControl(seek_control); + + seek_control=exchange_control; + } + break; + } + case MESSAGE_SET_MAIN_PARENT: + { + seek_control=(struct HEADER *)Parent->child_bk; + while(seek_control!=(struct HEADER*)NULL) + { + ControlProc=(void (*)(void *Control,struct MESSAGE *message))seek_control->ctrl_proc; + //send message to control for destroyng child controls + ControlProc(seek_control,message); + + seek_control->main_parent=(DWORD*)message->arg1; + + exchange_control=(struct HEADER *)seek_control->ctrl_fd; + seek_control=exchange_control; + } + break; + } + default:break; + } + } + Parent->active_control_for_mouse=(DWORD*)active_control_for_mouse; +} + +//--------------------------------------------------------------------------------- +// pack control_child in control_parent for libGUI +//--------------------------------------------------------------------------------- +//add new control for Parent +void PackControls(void *parent,void *Control) +{ + struct HEADER *Parent; + struct HEADER *last_control; + struct HEADER *control; + struct MESSAGE message; + + Parent=(struct HEADER *)parent; + control=(struct HEADER *)Control; + //set control's dependeces + + if (Parent->child_bk==NULL) + { + //create first child control for parent + Parent->child_bk=(DWORD*)control; + Parent->child_fd=(DWORD*)control; + + //init control + control->parent=(DWORD*)Parent; + control->ctrl_bk=(DWORD*)Parent;//last control is parent + control->ctrl_fd=(DWORD*)NULL;//haven't next control + } + else + { + //set new control as endest child control of parent + last_control=(struct HEADER*)Parent->child_fd; + Parent->child_fd=(DWORD*)control; + + last_control->ctrl_fd=(DWORD*)control; + control->ctrl_bk=(DWORD*)last_control; + control->ctrl_fd=(DWORD*)NULL; + control->parent=(DWORD*)Parent; + } + + //finite control's coordinates and size + control->ctrl_x=control->ctrl_x+Parent->ctrl_x; + control->ctrl_y=control->ctrl_y+Parent->ctrl_y; + + if (control->ctrl_sizex<=1) {control->ctrl_sizex=1;} + if (control->ctrl_sizey<=1) {control->ctrl_sizey=1;} + + message.type=(DWORD)MESSAGE_CHANGE_POSITION_EVENT; + message.arg1=Parent->ctrl_x; + message.arg2=Parent->ctrl_y; + //send message change position to child controls + SendMessage(control,&message); + + if (Parent->main_parent!=(DWORD*)NULL) + { + //tell all child controls of main parent who is main parent + message.type=MESSAGE_SET_MAIN_PARENT; + message.arg1=(DWORD)Parent->main_parent; + SendMessage((struct HEADER *)Parent,&message); + } +} + +//--------------------------------------------------------------------------------- +// show/hide controls +//--------------------------------------------------------------------------------- +void ShowControl(void *Control) +{ + struct HEADER *control; + control=(struct HEADER *)Control; + control->flags=control->flags | FLAG_SHOW_CONTROL; +} + +void HideControl(void *Control) +{ + struct HEADER *control; + control=(struct HEADER *)Control; + control->flags=control->flags & FLAG_HIDE_CONTROL; +} + +//--------------------------------------------------------------------------------- +// redraw control +//--------------------------------------------------------------------------------- +void RedrawControl(void *Control) +{ + struct HEADER *control; + struct MESSAGE message; + + control=(struct HEADER*)Control; + ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc; + message.type=MESSAGE_FULL_REDRAW_ALL; + ControlProc(control,&message); +} + +//--------------------------------------------------------------------------------- +// special redraw of control +//--------------------------------------------------------------------------------- +void SpecialRedrawControl(void *Control) +{ + struct HEADER *control; + struct MESSAGE message; + struct HEADERPARENT *main_parent; + + control=(struct HEADER*)Control; + main_parent=(struct HEADERPARENT*)control->main_parent; + control->flags=control->flags | FLAG_GET_SPECIALIZED_MESSAGE_ON; + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc; + + message.type=MESSAGE_SPECIALIZED; + ControlProc((struct HEADER*)main_parent,&message); +} + +//--------------------------------------------------------------------------------- +// set new size for control +//--------------------------------------------------------------------------------- +void SetControlSizeRequest(void *Control,int new_size_x,int new_size_y) +{ + struct HEADER *control; + struct HEADER *Parent; + + control=(struct HEADER*)Control; + Parent=(struct HEADER*)control->parent; + + control->ctrl_sizex=(DWORD)new_size_x; + control->ctrl_sizey=(DWORD)new_size_y; + + if ((control->ctrl_x+control->ctrl_sizex)>Parent->ctrl_sizex) {control->ctrl_sizex=Parent->ctrl_sizex-control->ctrl_x;} + if ((control->ctrl_y+control->ctrl_sizey)>Parent->ctrl_sizey) {control->ctrl_sizey=Parent->ctrl_sizey-control->ctrl_y;} + + if (control->ctrl_sizex<=1) {control->ctrl_sizex=1;} + if (control->ctrl_sizey<=1) {control->ctrl_sizey=1;} + +} + +//--------------------------------------------------------------------------------- +// get size x of control +//--------------------------------------------------------------------------------- +int GetControlSizeX(void *Control) +{ + struct HEADER *control; + + control=(struct HEADER *)Control; + + return ((int)control->ctrl_sizex); +} + +//--------------------------------------------------------------------------------- +// get size y of control +//--------------------------------------------------------------------------------- +int GetControlSizeY(void *Control) +{ + struct HEADER *control; + + control=(struct HEADER *)Control; + + return ((int)control->ctrl_sizey); +} + +//--------------------------------------------------------------------------------- +// set new size for control +//--------------------------------------------------------------------------------- +void SetControlNewPosition(void *Control,int new_x,int new_y) +{ + struct HEADER *control; + struct HEADER *Parent; + struct MESSAGE message; + parent_t *main_parent; + int old_x; + int old_y; + + control=(struct HEADER*)Control; + main_parent=(parent_t*)control->main_parent; + if (control->parent==(DWORD*)main_parent) + {//check position of child control of main parent + if (new_x+control->ctrl_sizex-1>screen.size_x) return; + if (new_y+control->ctrl_sizey-1>screen.size_y) return; + } + + message.type=(DWORD)MESSAGE_CHANGE_POSITION_EVENT; + message.arg1=(DWORD)(new_x-control->ctrl_x); + message.arg2=(DWORD)(new_y-control->ctrl_y); + + ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc; + ControlProc(control,&message); +} + +//--------------------------------------------------------------------------------- +// get x position of control +//--------------------------------------------------------------------------------- +int GetControlPositionX(void *Control) +{ + struct HEADER *control; + + control=(struct HEADER *)Control; + + return ((int)control->ctrl_x); +} + +//--------------------------------------------------------------------------------- +// get y position of control +//--------------------------------------------------------------------------------- +int GetControlPositionY(void *Control) +{ + struct HEADER *control; + + control=(struct HEADER *)Control; + + return ((int)control->ctrl_y); +} + +//--------------------------------------------------------------------------------- +// set focuse of input for control +//--------------------------------------------------------------------------------- +void *SetFocuse(void *Control) +{ + struct HEADER *control; + struct HEADERPARENT *main_parent; + struct HEADER *old_control; + struct MESSAGE *message; + + //new active control with focuse + control=(struct HEADER*)Control; + main_parent=(struct HEADERPARENT*)control->main_parent; + + if (main_parent==(struct HEADERPARENT*)NULL) return; + + //old control with focuse + old_control=(struct HEADER*)main_parent->global_active_control_for_keys; + + if (old_control!=(struct HEADER*)NULL) + { + message->type=MESSAGE_CHANGE_FOCUSE; + message->arg1=FALSE; + message->arg2=FALSE; + message->arg3=FALSE; + ControlProc=(void (*)(void *Control,struct MESSAGE *message))old_control->ctrl_proc; + ControlProc(old_control,message); + } + + message->type=MESSAGE_SET_FOCUSE; + message->arg1=FALSE; + message->arg2=FALSE; + message->arg3=FALSE;; + ControlProc=(void (*)(void *Control,struct MESSAGE *message))control->ctrl_proc; + ControlProc(control,message); + + return(old_control); +} + +//--------------------------------------------------------------------------------- +// set callback function for control +//--------------------------------------------------------------------------------- +void *SetCallbackFunction(void *Control,int event_name,void *callback_func,void *callback_func_data) +{ + struct HEADER *control; + struct CALLBACK *seek_callback; + struct CALLBACK *exchange_callback; + struct CALLBACK *new_callback; + + control=(struct HEADER *)Control; + seek_callback=(struct CALLBACK*)control->callback; + + if (seek_callback==(struct CALLBACK *)NULL) + { //callback function creating at first + new_callback=malloc(sizeof(struct CALLBACK)); + control->callback=(DWORD*)new_callback; + new_callback->clb_bk=(DWORD*)control; + new_callback->clb_fd=(DWORD*)NULL; + new_callback->clb_control=(DWORD*)control; + new_callback->connect_event=(DWORD)event_name; + new_callback->func=(DWORD*)callback_func; + new_callback->func_data=(DWORD*)callback_func_data; + new_callback->flags=0x0; + } + else + { + while(seek_callback!=(struct CALLBACK*)NULL) + { + if (seek_callback->clb_fd==(DWORD*)NULL) + {//create new callback control for callback function + new_callback=malloc(sizeof(struct CALLBACK)); + seek_callback->clb_fd=(DWORD*)new_callback; + new_callback->clb_bk=(DWORD*)seek_callback; + new_callback->clb_fd=(DWORD*)NULL; + new_callback->clb_control=(DWORD*)control; + new_callback->connect_event=(DWORD)event_name; + new_callback->func=(DWORD*)callback_func; + new_callback->func_data=(DWORD*)callback_func_data; + new_callback->flags=0x0; + break; + } + exchange_callback=(struct CALLBACK*)seek_callback->clb_fd; + seek_callback=exchange_callback; + } + } + + return(new_callback); +} + +//--------------------------------------------------------------------------------- +// block current callback function for control +//--------------------------------------------------------------------------------- +void BlockCallbackFunction(void *Control,void *callback_ID) +{ + struct HEADER *control; + struct CALLBACK *seek_callback; + struct CALLBACK *exchange_callback; + struct CALLBACK *unknown_callback; + + control=(struct HEADER *)Control; + + seek_callback=(struct CALLBACK *)control->callback; + unknown_callback=(struct CALLBACK*)callback_ID; + + while(seek_callback!=(struct CALLBACK*)NULL) + { + if (seek_callback==unknown_callback) + { + unknown_callback->flags=unknown_callback->flags | FLAG_BLOCK_CALLBACK_ON; + break; + } + exchange_callback=(struct CALLBACK*)seek_callback->clb_fd; + seek_callback=exchange_callback; + } + +} + +//--------------------------------------------------------------------------------- +// unblock current callback function for control +//--------------------------------------------------------------------------------- +void UnblockCallbackFunction(void *Control,void *callback_ID) +{ + struct HEADER *control; + struct CALLBACK *seek_callback; + struct CALLBACK *exchange_callback; + struct CALLBACK *unknown_callback; + + control=(struct HEADER *)Control; + + seek_callback=(struct CALLBACK *)control->callback; + unknown_callback=(struct CALLBACK*)callback_ID; + + while(seek_callback!=(struct CALLBACK*)NULL) + { + if (seek_callback==unknown_callback) + { + unknown_callback->flags=unknown_callback->flags & FLAG_BLOCK_CALLBACK_OFF; + break; + } + exchange_callback=(struct CALLBACK*)seek_callback->clb_fd; + seek_callback=exchange_callback; + } +} + +//--------------------------------------------------------------------------------- +// chack callback event for control +//--------------------------------------------------------------------------------- +void *ControlCheckCallbackEvent(void *Control,DWORD event) +{ + struct HEADER *control; + struct CALLBACK *seek_callback; + struct CALLBACK *exchange_callback; + + control=(struct HEADER *)Control; + seek_callback=(struct CALLBACK *)control->callback; + + while(seek_callback!=(struct CALLBACK*)NULL) + { + if ((seek_callback->flags & FLAG_BLOCK_CALLBACK_ON)==FALSE) + { + if (seek_callback->connect_event==event) return (seek_callback); + } + exchange_callback=(struct CALLBACK*)seek_callback->clb_fd; + seek_callback=exchange_callback; + } + return(NULL); +} + +//--------------------------------------------------------------------------------- +// set IDL function for libGUI +//--------------------------------------------------------------------------------- +void SetIDL_Function(parent_t *parent,void *function,void *function_data) +{ + parent->IDL_func=(DWORD*)function; + parent->IDL_func_data=(DWORD*)function_data; +} + +//--------------------------------------------------------------------------------- +// destroy IDL function for libGUI +//--------------------------------------------------------------------------------- +void DestroyIDL_Function(parent_t *parent) +{ + parent->IDL_func=(DWORD*)NULL; +} + +//--------------------------------------------------------------------------------- +// initialize libGUI +//--------------------------------------------------------------------------------- +char InitLibGUI() +{ + font_t *font; +//--------------------------------------------------------------------------------- +//---------------------------platform depended part of code------------------------ +//--------------------------------------------------------------------------------- + //set new events mask + gui_ksys_set_events_mask(119); + //set scan codes input mode for keyboard + gui_ksys_set_keyboard_input_mode(1); +//------------------------------------------------------------------------------------ + FontsMeneger.fnt_fd=(DWORD*)NULL; + FontsMeneger.fnt_bk=(DWORD*)NULL; + FontsMeneger.number_fonts=0; + //load default fonts + font=LoadFont("CHAR.MT"); + + if (font==NULL) return (TRUE); + else FontsMeneger.default_font=(DWORD*)font; + + font->flags=font->flags | FONT_FLAG_DEFAULT_FONT_ON; + + return(FALSE); +} + +//--------------------------------------------------------------------------------- +// quit from libGUI loop and destroy all GUI objects +//--------------------------------------------------------------------------------- +void QuitLibGUI(parent_t *window) +{ + font_t *font,*seek_font,*exchange_font; + gui_timer_t *seek_timer,*exchange_timer; + gui_message_t message; + + //destroy controls of parent window + message.type=MESSAGE_DESTROY_CONTROL; + SendMessage((header_t*)window,&message); +#ifdef DEBUG + gui_debug_out_str("\ncontrols destroyed"); +#endif + //destroy timers for callback functions + seek_timer=(gui_timer_t*)window->timer_bk; + while(seek_timer!=(gui_timer_t*)NULL) + { + exchange_timer=(gui_timer_t*)seek_timer->tmr_fd; + + DestroyTimerCallbackForFunction(seek_timer); + + seek_timer=exchange_timer; + } +#ifdef DEBUG + gui_debug_out_str("\ntimers destroyed"); +#endif + //free arrays of parent window + free(window->message); + free(window->control_for_callback_function); + free(window->callback_for_control_callback); +#ifdef DEBUG + gui_debug_out_str("\narrays destroyed"); +#endif + //destroy parent window + free(window); +#ifdef DEBUG + gui_debug_out_str("\nparent window destroyed"); +#endif + //destroy fonts cash + + seek_font=(font_t*)FontsMeneger.fnt_bk; + while(seek_font!=(font_t*)NULL) + { + exchange_font=(font_t*)seek_font->fnt_fd; + + free(seek_font->font); + DestroyFont(seek_font); + + seek_font=exchange_font; + } +#ifdef DEBUG + gui_debug_out_str("\nfonts destroyed"); +#endif + exit(0); +} + +DWORD LibGUIversion(void) +{ //03.10.09 + return(91003); +} diff --git a/programs/develop/new libGUI_C/SRC/main_libGUI.inc b/programs/develop/new libGUI_C/SRC/main_libGUI.inc new file mode 100755 index 0000000000..3e579eea08 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/main_libGUI.inc @@ -0,0 +1,224 @@ +/* + main meneger loop libGUI library +*/ + +void LibGUImain(parent_t *WindowParent) +{ + DWORD event,key,value; + header_t *control; + gui_message_t *events_message; + gui_timer_t *seek_timer,*exchange_timer; + gui_callbackevent_t *seek_calev,*calev,*exchange_calev; + int i; + char quit; + + + events_message=(struct MESSAGE*)WindowParent->message; + + //tell all child controls of main parent who is main parent + events_message->type=MESSAGE_SET_MAIN_PARENT; + events_message->arg1=(DWORD)WindowParent; + SendMessage((struct HEADER *)WindowParent,events_message); + + //display all created controls in window + gui_draw_window(WindowParent); + events_message->type=MESSAGE_FULL_REDRAW_ALL; + SendMessage((struct HEADER *)WindowParent,events_message); + + events_message->type=0; + + quit=FALSE; + WindowParent->number_callbacks=0; + + while (quit==FALSE) + { + //check for timers + if ((WindowParent->timer_bk!=(DWORD*)NULL) || + (WindowParent->number_timers_for_controls!=0)) {event=gui_ksys_check_event();} + else {event=gui_ksys_wait_event();} + //get and chack system events + switch(event) + { + case KOLIBRIOS_SYS_EVENT_BUTTON_PRESSED: + { + if (ControlCheckCallbackEvent(WindowParent,DELETE_EVENT)!=NULL) + { + WindowParent->flags |= FLAG_CONNECT_EVENT_ON; + WindowParent->control_for_callback_function[WindowParent->number_callbacks]= + (DWORD*)WindowParent; + WindowParent->callback_for_control_callback[WindowParent->number_callbacks]= + (DWORD*)ControlCheckCallbackEvent(WindowParent,(DWORD)DELETE_EVENT); + WindowParent->number_callbacks++; + } + + quit=TRUE; + break; + } + + case KOLIBRIOS_SYS_EVENT_REDRAW: + { + GetNewWindowSizePos(WindowParent); + SetWindowSizeRequest(WindowParent,WindowParent->ctrl_sizex,WindowParent->ctrl_sizey); + gui_draw_window(WindowParent); + + events_message->type=MESSAGE_FULL_REDRAW_ALL; + SendMessage((struct HEADER *)WindowParent,events_message); + break; + } + + case KOLIBRIOS_SYS_EVENT_KEYS: + { + key=gui_ksys_get_key(); + + + key=key>>8; + + if (key & 128) + { + events_message->arg1=KEY_UP; + events_message->arg2=key & 127; + } + else + { + events_message->arg1=KEY_DOWN; + events_message->arg2=key; + } + + events_message->type=MESSAGE_KEYS_EVENT; + SendMessage((struct HEADER *)WindowParent,events_message); + break; + } + + case KOLIBRIOS_SYS_EVENT_MOUSE: + { + value=gui_ksys_get_window_mouse_coordinates(); + + events_message->type=MESSAGE_MOUSE_EVENT; + events_message->arg2=(value & 0xffff)-screen.y;//y + value=value >>16; + events_message->arg1=value-screen.x;//x + + value=gui_ksys_get_mouse_buttons_state(); + + switch(value) + { + case KOLIBRIOS_SYS_MOUSE_BUTTON_LEFT_DOWN: + { + events_message->arg3=MOUSE_LEFT_BUTTON_DOWN; + break; + } + case KOLIBRIOS_SYS_MOUSE_BUTTON_RIGHT_DOWN: + { + events_message->arg3=MOUSE_RIGHT_BUTTON_DOWN; + break; + } + case KOLIBRIOS_SYS_MOUSE_BUTTON_MIDDLE_DOWN: + { + events_message->arg3=MOUSE_MIDDLE_BUTTON_DOWN; + break; + } + case KOLIBRIOS_SYS_MOUSE_BUTTON_4_DOWN: + { + events_message->arg3=MOUSE_4_BUTTON_DOWN; + break; + } + case KOLIBRIOS_SYS_MOUSE_BUTTON_5_DOWN: + { + events_message->arg3=MOUSE_5_BUTTON_DOWN; + break; + } + default: + { + if (events_message->arg3==MOUSE_LEFT_BUTTON_DOWN) + { + events_message->arg3=MOUSE_LEFT_BUTTON_UP; + break; + } + if (events_message->arg3==MOUSE_RIGHT_BUTTON_DOWN) + { + events_message->arg3=MOUSE_RIGHT_BUTTON_UP; + break; + } + if (events_message->arg3==MOUSE_MIDDLE_BUTTON_DOWN) + { + events_message->arg3=MOUSE_MIDDLE_BUTTON_UP; + break; + } + if (events_message->arg3==MOUSE_4_BUTTON_DOWN) + { + events_message->arg3=MOUSE_4_BUTTON_UP; + break; + } + if (events_message->arg3==MOUSE_5_BUTTON_DOWN) + { + events_message->arg3=MOUSE_5_BUTTON_UP; + break; + } + + break; + } + } + SendMessage((struct HEADER *)WindowParent,events_message); + break; + } + } + + //call functions for events + seek_calev=(struct CALLBACKEVENT*)WindowParent->calev_bk; + while(seek_calev!=(struct CALLBACKEVENT*)NULL) + { + if (seek_calev->event_type==events_message->type) + { + CallbackFunctionForEvent=(void(*)(struct MESSAGE *message,void *data))seek_calev->func; + CallbackFunctionForEvent(events_message,seek_calev->func_data); + } + exchange_calev=(struct CALLBACKEVENT*)seek_calev->calev_fd; + seek_calev=exchange_calev; + } + + + //call timers of controls + if (WindowParent->number_timers_for_controls!=0) + { + events_message->type=(char)MESSAGE_CALL_TIMER_EVENT; + SendMessage((struct HEADER *)WindowParent,events_message); + } + + //call callback functions + for(i=0;inumber_callbacks;i++) + { + control=(struct HEADER*)WindowParent->control_for_callback_function[i]; + //check callback control + if (control!=(struct HEADER*)NULL) + { + calev=(struct CALLBACKEVENT*)WindowParent->callback_for_control_callback[i]; + if (control->flags & FLAG_CONNECT_EVENT_ON) + { + CallbackFunction=(void (*)( struct HEADER *Control,void *data))calev->func; + CallbackFunction(control,calev->func_data); + + control->flags=control->flags & FLAG_CONNECT_EVENT_OFF; + } + } + } + WindowParent->number_callbacks=0; + + //call timers of parent window + seek_timer=(struct TIMER*)WindowParent->timer_bk; + while(seek_timer!=(struct TIMER*)NULL) + { + if (seek_timer->flags & FLAG_TIMER_ON) Timer(seek_timer); + + exchange_timer=(struct TIMER*)seek_timer->tmr_fd; + seek_timer=exchange_timer; + } + + //check for IDL function and call it if enabled + if (WindowParent->IDL_func!=(DWORD*)NULL) + { + IDL_Function=(void(*)(void *data))WindowParent->IDL_func; + IDL_Function(WindowParent->IDL_func_data); + } + + } +} diff --git a/programs/develop/new libGUI_C/SRC/parent_window.inc b/programs/develop/new libGUI_C/SRC/parent_window.inc new file mode 100755 index 0000000000..d8290dcb37 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/parent_window.inc @@ -0,0 +1,132 @@ +/* + create parent of window +*/ + +#define PARENT_WINDOW_DEFAULT_SIZEX 320 +#define PARENT_WINDOW_DEFAULT_SIZEY 200 + +#define PARENT_WINDOW_BORDER_WIDTH 5; + +void gui_get_screen_parameters(void) +{ + int value; + + value=(int)gui_ksys_get_screen_bits_per_pixel(); + screen.bits_per_pixel=(char)value; + screen.bytes_per_pixel=screen.bits_per_pixel >> 3; + + screen.skin_height=gui_ksys_get_skin_height(); + + screen.x=PARENT_WINDOW_BORDER_WIDTH; + screen.y=screen.skin_height; + + value=gui_ksys_get_screen_size(); + screen.display_size_y=value & 0xffff; + screen.display_size_y=value >> 16; +} + +void gui_draw_window(parent_t *window) +{ + DWORD flag; + + flag=3; + flag=flag<<24; + flag +=0xaabbcc; + + gui_ksys_begin_draw_window(); + gui_ksys_draw_window(window->ctrl_x,window->ctrl_y,window->ctrl_sizex,window->ctrl_sizey,flag); + gui_ksys_finish_draw_window(); +} + +//--------------------------------------------------------------------------------- +// create window parent +//--------------------------------------------------------------------------------- +void* CreateWindow(void) +{ + struct HEADERPARENT *WindowParent; + + WindowParent=malloc(sizeof(parent_t)); + WindowParent->message=malloc(sizeof(gui_message_t)); + WindowParent->control_for_callback_function=malloc(sizeof(DWORD)*MAX_CALLBACKS); + WindowParent->callback_for_control_callback=malloc(sizeof(DWORD)*MAX_CALLBACKS); + + WindowParent->main_parent=(DWORD*)WindowParent; + WindowParent->global_active_control_for_keys=(DWORD*)NULL; + + WindowParent->control_for_callback_function[0]=(DWORD*)NULL; + WindowParent->number_callbacks=0; + + WindowParent->child_bk=(DWORD*)NULL; + WindowParent->active_control_for_keys=(DWORD*)NULL; + WindowParent->active_control_for_mouse=(DWORD*)NULL; + WindowParent->ctrl_x=0x0; + WindowParent->ctrl_y=0x0; + WindowParent->ctrl_sizex=PARENT_WINDOW_DEFAULT_SIZEX; + WindowParent->ctrl_sizey=PARENT_WINDOW_DEFAULT_SIZEY; + WindowParent->callback=(DWORD*)NULL;//no callbacks yet + WindowParent->timer=(DWORD*)NULL;//no timers yet + + WindowParent->flags=0; + WindowParent->flags=WindowParent->flags | FLAG_SHOW_CONTROL; + WindowParent->flags=WindowParent->flags | FLAG_FOCUSE_INPUT_SUPPOROTE; + + WindowParent->number_timers_for_controls=0; + WindowParent->timer_bk=(DWORD*)NULL; + WindowParent->timer_fd=(DWORD*)NULL; + + WindowParent->calev_bk=(DWORD*)NULL; + WindowParent->calev_fd=(DWORD*)NULL; + + WindowParent->IDL_func=(DWORD*)NULL; + +//--------------------------------------------------------------------------------- +//---------------------------platform depended part of code------------------------ +//--------------------------------------------------------------------------------- + //create and initialize screen buffer + gui_get_screen_parameters(); + //by default draw output to the screen + screen.draw_output=DRAW_OUTPUT_SCREEN; + //calculate size of client's arrea + screen.size_x=WindowParent->ctrl_sizex-9; + screen.size_y=WindowParent->ctrl_sizey-screen.skin_height-4; +//---------------------------------------------------------------------------------- + ID=0; + return(WindowParent); +} + +//--------------------------------------------------------------------------------- +// create window parent +//--------------------------------------------------------------------------------- +void SetWindowSizeRequest(parent_t *WindowParent,int size_x,int size_y) +{ + static int x,y,sizex,sizey; +//--------------------------------------------------------------------------------- +//---------------------------platform depended part of code------------------------ +//--------------------------------------------------------------------------------- + x=WindowParent->ctrl_x; + y=WindowParent->ctrl_y; + sizex=size_x; + sizey=size_y; + gui_ksys_set_position_and_size_window(x,y,sizex,sizey); +//--------------------------------------------------------------------------------- + WindowParent->ctrl_sizex=sizex; + WindowParent->ctrl_sizey=sizey; + + screen.size_x=WindowParent->ctrl_sizex-9; + screen.size_y=WindowParent->ctrl_sizey-screen.skin_height-4; +} + +void GetNewWindowSizePos(parent_t *WindowParent) +{ + static process_table_t procinfo; + + gui_ksys_get_current_process_information(&procinfo); + + WindowParent->ctrl_x=(DWORD)procinfo.winx_start; + WindowParent->ctrl_y=(DWORD)procinfo.winy_start; + WindowParent->ctrl_sizex=(DWORD)procinfo.winx_size; + WindowParent->ctrl_sizey=(DWORD)procinfo.winy_size; + + //get screen parameters again + gui_get_screen_parameters(); +} diff --git a/programs/develop/new libGUI_C/SRC/stdarg.h b/programs/develop/new libGUI_C/SRC/stdarg.h new file mode 100755 index 0000000000..a7dcdfa3c4 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/stdarg.h @@ -0,0 +1,8 @@ + +typedef char *va_list; +#define _roundsize(n) ( (sizeof(n) + 3) & ~3 ) +#define va_start(ap,v) (ap = (va_list)&v+_roundsize(v)) +#define va_arg(ap,t) ( *(t *)((ap += _roundsize(t)) - _roundsize(t)) ) +#define va_end(ap) (ap = (va_list)0) + + diff --git a/programs/develop/new libGUI_C/SRC/stdio.h b/programs/develop/new libGUI_C/SRC/stdio.h new file mode 100755 index 0000000000..c71b516a7e --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/stdio.h @@ -0,0 +1,3 @@ + +static int cdecl printf(const char *format,...); + diff --git a/programs/develop/new libGUI_C/SRC/stdio.inc b/programs/develop/new libGUI_C/SRC/stdio.inc new file mode 100755 index 0000000000..a7120f06c9 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/stdio.inc @@ -0,0 +1,790 @@ +/* + function for format output to the string +*/ + +static int formatted_double_to_string(long double number,int format1,int format2,char *s) +{ +/* + double n; + double nbefor; + double nafter; + double v,v2; + long intdigit; + long beforpointdigit; + long div; + int i; + int pos; + int size; + int fmt1; + int fmt2; + long mul; + static char buf[200]; + + size=(int)s; + n=(double)number; + if (n<0) {*s='-';s++;n=-n;} + + fmt1=format1; + fmt2=format2; + if (fmt2>18) {fmt2=18;} //maximum of size long long type + + //clear array befor output + for(i=0;i<=200;i++) {buf[i]=0;} + + if ((fmt1>=0) && (n<1)) + { //formatted output if 0<=n<1 + mul=1; + for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} + else {*s='0';} + s++; + } + } + else + { //if n>=1 + //v=floorf(n+0.00000000000001); + beforpointdigit=floor(n+0.00000000000001); + //beforpointdigit=n; + nbefor=beforpointdigit; + nafter=n-nbefor; + + //print part of number befor point + mul=1; + for(i=0;i<200-2;i++) + { + mul=mul*10; + if ((beforpointdigit/mul)==0) {fmt1=i+1;break;} + } + + pos=0; + mul=mul/10; + for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} + s++; + } + + //print part of number after point + mul=1; + for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} + else {*s='0';} + s++; + } + + } + size=(int)s-size; + return(size); +*/ +} + +static int formatted_long_to_string(long long number,int fmt1,char *s) +{ + int i; + int pos; + int fmt; + int size; + int difference_pos; + long digit; + long mul; + long div; + static char buf[200]; + + //clear array befor output + for(i=0;i<200;i++) {buf[i]=0;} + digit=number; + + size=(int)s; + if (digit<0) {*s='-';s++;digit=-digit;} + if (digit==0) {*s='0';s++;goto end;} + + mul=1; + for(i=0;i<200-2;i++) + { + mul=mul*10; + if ((digit/mul)==0) {fmt=i+1;break;} + } + + difference_pos=i+1; + + pos=0; + mul=mul/10; + for(i=0;i=difference_pos) fmt=fmt1; + else + fmt=difference_pos; + + for(i=0;i=0) && (buf[i]<=9)) {*s='0'+buf[i];} + } + else + { + *s=' '; + } + s++; + } + end: + size=(int)s-size; + return(size); +} + +static int formatted_hex_to_string(long long number,int fmt1,char flag_register,char *s) +{ + long n; + int i,pos; + int fmt; + long size; + int difference_pos; + static char xdigs_lower[16]="0123456789abcdef"; + static char xdigs_upper[16]="0123456789ABCDEF"; + static char buf[200]; + + n=(long)number; + size=(int)s; + if (n<0) {*s='-';s++;n=-n;} + + if (n==0) {*s='0';s++;goto end;} + for(i=0;i<200;i++) {buf[i]=0;} + + i=0; + if (flag_register==0) + { + while (n>0) + { + buf[i]=xdigs_lower[n & 15]; + n=n>>4; + i++; + } + } + else + { + while (n>0) + { + buf[i]=xdigs_upper[n & 15]; + n=n>>4; + i++; + } + } + + pos=i; + difference_pos=i; + + for(i=pos-1;i>=0;i--) + { + *s=buf[i]; + s++; + } + + if (fmt1-difference_pos>0) + { + for(i=difference_pos+1;i<=fmt1;i++) + { + *s=' '; + s++; + } + } + end:size=(int)s-size; + return(size); +} + +static int formatted_octa_to_string(long long number,int fmt1,char flag_register,char *s) +{ + long n; + int i,pos; + int fmt; + long size; + int difference_pos; + static char xdigs_lower[16]="012345678"; + static char buf[200]; + + n=number; + size=(int)s; + if (n<0) {*s='-';s++;n=-n;} + + if (n==0) {*s='0';s++;goto end;} + for(i=0;i<200;i++) {buf[i]=0;} + + i=0; + if (flag_register==0) + { + while (n>0) + { + buf[i]=xdigs_lower[n & 7]; + n=n>>3; + i++; + } + } + + pos=i; + difference_pos=i; + + for(i=pos-1;i>=0;i--) + { + *s=buf[i]; + s++; + } + + if (fmt1-difference_pos>0) + { + for(i=difference_pos+1;i<=fmt1;i++) + { + *s=' '; + s++; + } + } + end:size=(int)s-size; + return(size); +} + +static int format_print(char *dest, size_t maxlen,const char *fmt0, va_list argp) +{ + int i,j,k; + int length; + int fmt1,fmt2,stepen; + size_t pos,posc; + long long intdigit; + long double doubledigit; + float floatdigit; + const char *fmt,*fmtc; + char *s; + char *str; + static char buffmt1[30]; + static char buffmt2[30]; + static char buf[1024]; + char format_flag; + char flag_point; + char flag_noformat; + char flag_long; + char flag_unsigned; + char flag_register; + char flag_plus; + + fmt=fmt0; + s=dest; + pos=0; + while(pos0) && (flag_plus==1) && (pos+1=0;i--) + { + fmt1=fmt1+buffmt1[i]*stepen; + stepen=stepen*10; + } + stepen=1; + for(i=k-1;i>=0;i--) + { + fmt2=fmt2+buffmt2[i]*stepen; + stepen=stepen*10; + } + switch(*fmtc) + { + case 'f': + case 'F': + if (flag_long==0) {doubledigit=va_arg(argp,double);} + if (flag_long>=1) {doubledigit=va_arg(argp,long double);} + //doubledigit=*((double *)argp); + //sargp=argp+8; + length=formatted_double_to_string(doubledigit,fmt1,fmt2,buf); + if ((pos+length)0) && (flag_plus==1) && (pos+1*string2) + return 1; + if (*string1=='\0') + return 0; + string1++; + string2++; + } +} + +static int strncmp(const char* string1, const char* string2, int count) +{ + while(count>0 && *string1==*string2) + { + if (*string1) return 0; + ++string1; + ++string2; + --count; + } + if(count) return (*string1 - *string2); + return 0; +} + +static int sprintf(char *dest,const char *format,...) +{ + va_list arg; + va_start (arg, format); + return format_print(dest,4096, format, arg); +} + +static int snprintf(char *dest, size_t size,const char *format,...) +{ + va_list arg; + va_start (arg, format); + return format_print(dest,size, format, arg); +} + +static int vsnprintf(char *dest, size_t size,const char *format,va_list ap) +{ + return format_print(dest,size, format, ap); +} + + diff --git a/programs/develop/new libGUI_C/SRC/types.h b/programs/develop/new libGUI_C/SRC/types.h new file mode 100755 index 0000000000..218cffe0b2 --- /dev/null +++ b/programs/develop/new libGUI_C/SRC/types.h @@ -0,0 +1,17 @@ +/* + some used types +*/ +#define NULL (void*)0 + +typedef unsigned int DWORD; +typedef unsigned char BYTE; +typedef unsigned short int WORD; +typedef unsigned int size_t; + + +//#define stdcall __attribute__((stdcall)) +//#define cdecl __attribute__((cdecl)) + +//for win compilers +#define stdcall __stdcall +#define cdecl __cdecl diff --git a/programs/develop/new libGUI_C/examples/src/button.c b/programs/develop/new libGUI_C/examples/src/button.c new file mode 100755 index 0000000000..55893507d5 --- /dev/null +++ b/programs/develop/new libGUI_C/examples/src/button.c @@ -0,0 +1,70 @@ +/* + test libGUI library +*/ +#include "stdarg.h" +#include "libGUI.h" +#include "stdio.h" +#include "stdlib.h" +#include "string.h" + +#define FALSE 0 +#define TRUE 1 + +void callback_func_delete_window(header_t *control,void *data) +{ + QuitLibGUI((parent_t*)control); +} + +void callback_func1(header_t *control,void *data) +{ + printf("\nentry in button"); +} + +void callback_func2(header_t *control,void *data) +{ + printf("\nbutton pressed"); +} + +void callback_func3(header_t *control,void *data) +{ + printf("\nbutton released"); +} + +void callback_func4(header_t *control,void *data) +{ + printf("\nleave button"); +} + +int main(int argc, char *argv[]) +{ + parent_t *window; + gui_callback_t *id1,*id2,*id3,*id4; + gui_button_data_t button_data; + gui_button_t *button; + + //load libGUI library + LoadLibGUI(NULL); + + //create main window + window=CreateWindow(); + SetWindowSizeRequest(window,90,60); + //create button + button_data.x=5; + button_data.y=5; + button_data.width=70; + button_data.height=20; + //create button with text + button=CreateButtonWithText(&button_data,"Click my!"); + //set callback functions for button close window + SetCallbackFunction(window,DELETE_EVENT,&callback_func_delete_window,NULL); + + //set callback functions for button + id1=SetCallbackFunction(button,BUTTON_ENTER_EVENT,&callback_func1,NULL); + id2=SetCallbackFunction(button,BUTTON_PRESSED_EVENT,&callback_func2,NULL); + id3=SetCallbackFunction(button,BUTTON_RELEASED_EVENT,&callback_func3,NULL); + id4=SetCallbackFunction(button,BUTTON_LEAVE_EVENT,&callback_func4,NULL); + //pack button in window + PackControls(window,button); + //start main libGUI loop + LibGUImain(window); +} diff --git a/programs/develop/new libGUI_C/examples/src/image.c b/programs/develop/new libGUI_C/examples/src/image.c new file mode 100755 index 0000000000..1b81c08a9d --- /dev/null +++ b/programs/develop/new libGUI_C/examples/src/image.c @@ -0,0 +1,52 @@ +/* + test libGUI library +*/ +#include "stdarg.h" +#include "libGUI.h" +#include "stdlib.h" +#include "stdio.h" + +void callback_func_delete_window(header_t *control,void *data) +{ + QuitLibGUI((parent_t*)control); +} + +int main(int argc, char *argv[]) +{ + parent_t *window; + gui_image_data_t imdata; + gui_image_t *image; + int i,j; + unsigned int *img; + + //load libGUI library + LoadLibGUI(NULL);//use default system path to library + //create main window + window=CreateWindow(); + //change window size + SetWindowSizeRequest(window,220,142); + //set callback function for close window button + SetCallbackFunction(window,DELETE_EVENT,&callback_func_delete_window,NULL); + //create image + imdata.x=5; + imdata.y=5; + imdata.width=200; + imdata.height=100; + imdata.bits_per_pixel=32;//bits per pixel + + image=CreateImage(&imdata); + img=(unsigned int*)image->img; + //generate 32 bits image + for(i=0;iprogress+=0.01;//incrase progress + + if (progress_bar->progress>1.0) progress_bar->progress=0.0; + + //calculate progress level in % + progress=progress_bar->progress*100; + snprintf(txt,16,"progress %d%%",progress); + //set text for progress bar + ProgressBarSetText(progress_bar,txt); +} + +int main(int argc, char *argv[]) +{ + parent_t *window; + gui_progress_bar_data_t progress_bar_data; + gui_progress_bar_t *progress_bar; + gui_timer_t *timer; + + //load libGUI library + LoadLibGUI(NULL);//use default system path to library + //create main window + window=CreateWindow(); + //change size of main window + SetWindowSizeRequest(window,320,57); + //set callback function for button close window + SetCallbackFunction(window,DELETE_EVENT,&callback_func_delete_window,NULL); + //create progress bar + progress_bar_data.x=5; + progress_bar_data.y=5; + progress_bar_data.width=300; + progress_bar_data.height=25; + progress_bar_data.progress=0.0; + progress_bar=CreateProgressBar(&progress_bar_data); + + //create timer for update progress level each 50 millisecunds + timer=SetTimerCallbackForFunction(window,5,&ProgressBarCallback,progress_bar); + + //pack progress bar in window + PackControls(window,progress_bar); + + //update progress bar automatically each 50 millisecund + SetProgressBarPulse(progress_bar,5); + + //call main libGUI loop + LibGUImain(window); +} diff --git a/programs/develop/new libGUI_C/examples/src/scroll_bar.c b/programs/develop/new libGUI_C/examples/src/scroll_bar.c new file mode 100755 index 0000000000..8225c796b5 --- /dev/null +++ b/programs/develop/new libGUI_C/examples/src/scroll_bar.c @@ -0,0 +1,76 @@ +/* + test libGUI library +*/ +#include "stdarg.h" +#include "libGUI.h" +#include "stdio.h" + +#define FALSE 0 +#define TRUE 1 + +void callback_func_delete_window(header_t *control,void *data) +{ + printf("\nlibGUI quit..."); + QuitLibGUI((parent_t*)control); +} + +void ScrollStateH(header_t *control,void *data) +{ + gui_scroll_bar_t *hsc; + + hsc=(gui_scroll_bar_t*)control; + printf("\nhorizontal ruler position %d%%",(int)(hsc->ruller_pos*100)); +} + +void ScrollStateV(header_t *control,void *data) +{ + gui_scroll_bar_t *vsc; + + vsc=(gui_scroll_bar_t*)control; + printf("\nvertical ruler position %d%%",(int)(vsc->ruller_pos*100)); +} + +int main(int argc, char *argv[]) +{ + parent_t *window; + gui_callback_t *id1,*id2; + gui_scroll_bar_data_t horizontal_sbar_data; + gui_scroll_bar_data_t vertical_sbar_data; + gui_scroll_bar_t *ScrollBarH; + gui_scroll_bar_t *ScrollBarV; + + //load libGUI library + LoadLibGUI(NULL);//use default system path to library + //create main window + window=CreateWindow(); + //change size of window + SetWindowSizeRequest(window,270,207); + //create horizontal scroll bar + horizontal_sbar_data.x=5; + horizontal_sbar_data.y=5; + horizontal_sbar_data.width=250; + horizontal_sbar_data.height=16; + horizontal_sbar_data.ruller_size=0.2;//size of ruler E [0,1] + horizontal_sbar_data.ruller_pos=0.5;//ruler position E [0,1] + horizontal_sbar_data.ruller_step=0.1;//step of change ruler pos after press of button E [0,1] + //create vertical scroll bar + vertical_sbar_data.x=5; + vertical_sbar_data.y=26; + vertical_sbar_data.width=16; + vertical_sbar_data.height=150; + vertical_sbar_data.ruller_size=0.5;//size of ruler E [0,1] + vertical_sbar_data.ruller_pos=0.05;//ruler position E [0,1] + vertical_sbar_data.ruller_step=0.1;//step of change ruler pos after press of button E [0,1] + + //create horizontal and vertical scroll bars + ScrollBarH=CreateHorizontalScrollBar(&horizontal_sbar_data); + ScrollBarV=CreateVerticalScrollBar(&vertical_sbar_data); + //set callback functions for scroll bars + id1=SetCallbackFunction(ScrollBarH,SCROLLBAR_CHANGED_EVENT,&ScrollStateH,NULL); + id2=SetCallbackFunction(ScrollBarV,SCROLLBAR_CHANGED_EVENT,&ScrollStateV,NULL); + //pack scroll bars in window + PackControls(window,ScrollBarH); + PackControls(window,ScrollBarV); + //start minl libGUI loop + LibGUImain(window); +} diff --git a/programs/develop/new libGUI_C/examples/src/scrolled_window.c b/programs/develop/new libGUI_C/examples/src/scrolled_window.c new file mode 100755 index 0000000000..6aa550d620 --- /dev/null +++ b/programs/develop/new libGUI_C/examples/src/scrolled_window.c @@ -0,0 +1,67 @@ +/* + test libGUI library +*/ +#include "stdarg.h" +#include "libGUI.h" +#include "stdio.h" +#include "stdlib.h" +#include "string.h" + +void callback_func_delete_window(header_t *control,void *data) +{ + QuitLibGUI((parent_t*)control); +} + +void callback_func(header_t *control,void *data) +{ + printf("\npressed button with ID=%d control=%d",(int)control->ctrl_ID,(int)control); +} + +int main(int argc, char *argv[]) +{ + parent_t *window; + gui_button_data_t button_data; + gui_button_t *button; + gui_scrolled_window_data_t scroll_win_data; + gui_scrolled_window_t *ScrollWin; + int i,j; + static char txt[20]; + + //load libGUI library + LoadLibGUI(NULL); + //create main window + window=CreateWindow(); + //change size of window + SetWindowSizeRequest(window,270,282); + + //create scrolled window + scroll_win_data.x=5; + scroll_win_data.y=5; + scroll_win_data.width=250; + scroll_win_data.height=250; + ScrollWin=CreateScrolledWindow(&scroll_win_data); + + //create buttons + for(j=1;j<=10;j++) + { + for(i=1;i<=10;i++) + { + button_data.x=10+(i-1)*75; + button_data.y=10+(j-1)*25; + button_data.width=70; + button_data.height=20; + + snprintf(txt,20,"(%d,%d)",j,i); + button=CreateButtonWithText(&button_data,txt); + + SetCallbackFunction(button,BUTTON_PRESSED_EVENT,&callback_func,NULL); + ScrolledWindowPackControls(ScrollWin,button); + } + } + //set callback function for button close window + SetCallbackFunction(window,DELETE_EVENT,&callback_func_delete_window,NULL); + //pack scrolled window in window + PackControls(window,ScrollWin); + //start main libGUI loop + LibGUImain(window); +} diff --git a/programs/develop/new libGUI_C/examples/src/text.c b/programs/develop/new libGUI_C/examples/src/text.c new file mode 100644 index 0000000000..6d42072806 --- /dev/null +++ b/programs/develop/new libGUI_C/examples/src/text.c @@ -0,0 +1,45 @@ +/* + hello world example +*/ + +#include "libGUI.h" + +#define TRUE 1 +#define FALSE 0 + +void callback_func_delete_window(header_t *control,void *data) +{ + QuitLibGUI((parent_t*)control); +} + +int main(int argc, char *argv[]) +{ + parent_t *window; + gui_text_data_t txtdata; + gui_text_t *text; + + //load libGUI library + LoadLibGUI(NULL);//load from default system path to library + //create main window + window=CreateWindow(); + //change size of window + SetWindowSizeRequest(window,92,46); + //set callback function for button close window + SetCallbackFunction(window,DELETE_EVENT,&callback_func_delete_window,NULL); + //create control text + txtdata.x=5; + txtdata.y=5; + txtdata.font=NULL;//use default system libGUI font + txtdata.background=TRUE;//use background for text + txtdata.color=0xffffff;//text color + txtdata.background_color=0xff8000;//background color + txtdata.text="Hello world!"; + text=CreateText(&txtdata); + + //pack control text in window + PackControls(window,text); + + //start libGUI main loop + LibGUImain(window); +} +