Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1156 → Rev 1157

/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");
}
}
 
 
 
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SDK/MinGW(windows)/libGUI.h
0,0 → 1,592
/*
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
+
+};
+#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);
+
Property changes:
Added: svn:executable
/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);
}
}
}
 
 
 
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SDK/gcc(unix)/libGUI.h
0,0 → 1,590
/*
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
+
+}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);
+
Property changes:
Added: svn:executable
/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)
Property changes:
Added: svn:executable
/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
Property changes:
Added: svn:executable
/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
 
Property changes:
Added: svn:executable
/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);
}
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/control_image.h
___________________________________________________________________
Added: svn:executable
/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);
}
 
Property changes:
Added: svn:executable
/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
 
Property changes:
Added: svn:executable
/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);
}
Property changes:
Added: svn:executable
/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
Property changes:
Added: svn:executable
/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_pos<ruller_min) ruller_pos=ruller_min;
if (ruller_pos>ruller_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_pos<ruller_min) ruller_pos=ruller_min;
if (ruller_pos>ruller_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);
}
 
Property changes:
Added: svn:executable
/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
 
Property changes:
Added: svn:executable
/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;i<ScrolledWindow->number_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;i<ScrolledWindow->number_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_sizex<sizex) sx=x+sizex-control->ctrl_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_sizey<sizey) sy=y+sizey-control->ctrl_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;i<ScrolledWindow->number_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;i<ScrolledWindow->number_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;i<ScrolledWindow->number_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);
}
 
Property changes:
Added: svn:executable
/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;
 
 
Property changes:
Added: svn:executable
/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);
}
Property changes:
Added: svn:executable
/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
 
Property changes:
Added: svn:executable
/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<j;i++)
{
*(DWORD*)buf=(DWORD)value;
buf=(DWORD*)buf+1;
}
break;
}
case 24:
{
b=value & 0xff;
value=value >> 8;
g=value & 0xff;
value=value >> 8;
r=value & 0xff;
 
j=(size/3)+3;
for(i=0;i<j;i++)
{
*(char*)buf=(char)b;
*((char*)buf+1)=(char)g;
*((char*)buf+2)=(char)r;
buf=(char*)buf+3;
}
break;
}
case 16:
{
break;
}
case 8:
{
break;
}
case 4:
{
break;
}
default: break;
}
}
 
//---------------------------------------------------------------------------------
// draw pixel on screen
//---------------------------------------------------------------------------------
void DrawPixel(int x,int y,DWORD color)
{
char r,g,b;
char *ptr;
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;
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<y2) {a=y1;count=y2-y1;}
else
{a=y2;count=y1-y2;}
 
ptr=screen.buffer;
switch(screen.bits_per_pixel)
{
case 24:
{
ptr=ptr+(a*screen.size_x+x)*3;
b=color & 0xff;
color=color >>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 (y2<y1)
{
v=y1;
y1=y2;
y2=v;
}
 
if (x<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y1>ymax) 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<x2) {a=x1;count=x2-x1;}
else
{a=x2;count=x1-x2;}
 
ptr=screen.buffer;
switch(screen.bits_per_pixel)
{
case 24:
{
ptr=ptr+(y*screen.size_x+a)*3;
b=color & 0xff;
color=color >>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 (x2<x1)
{
v=x1;
x1=x2;
x2=v;
}
 
if (y<ymin) return;
if (y>ymax) return;
if (x2<xmin) return;
if (x1>xmax) 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<size_y;i++)
{
DrawHorizontalLine(x,x+size_x-1,j,color);
j++;
}
break;
}
}
}
 
//---------------------------------------------------------------------------------
// libGUI function drawing filled gradient up and down rectangles on screen
//---------------------------------------------------------------------------------
void DrawGradientUpDownFilledRectangle(char flag_up,int x,int y,int sizex,int sizey,DWORD color_from,DWORD color_to)
{
unsigned char r_f,g_f,b_f;
unsigned char r_t,g_t,b_t;
unsigned char r,g,b;
float f_r,f_g,f_b;
float d_r,d_g,d_b;
float div;
DWORD color;
int i,j,dj;
 
if (sizex==0 || sizey==0) return;
 
color=color_from;
b_f=color & 0xff;
color=color >> 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<sizey;i++)
{
color=0;
color=color | r;
color=color << 8;
color=color | g;
color=color << 8;
color=color | b;
 
DrawHorizontalLine(x,x+sizex-1,j,color);
 
f_r=f_r+d_r;
f_g=f_g+d_g;
f_b=f_b+d_b;
 
r=(char)f_r;
g=(char)f_g;
b=(char)f_b;
 
j=j+dj;
}
 
}
 
//---------------------------------------------------------------------------------
// libGUI function drawing filled gradient left and right rectangles on screen
//---------------------------------------------------------------------------------
void DrawGradientLeftRightFilledRectangle(char flag_left,int x,int y,int sizex,int sizey,DWORD color_from,DWORD color_to)
{
unsigned char r_f,g_f,b_f;
unsigned char r_t,g_t,b_t;
unsigned char r,g,b;
float f_r,f_g,f_b;
float d_r,d_g,d_b;
float div;
DWORD color;
int i,j,dj;
 
if (sizex==0 || sizey==0) return;
 
color=color_from;
b_f=color & 0xff;
color=color >> 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<sizex;i++)
{
color=0;
color=color | r;
color=color << 8;
color=color | g;
color=color << 8;
color=color | b;
 
DrawVerticalLine(j,y,y+sizey-1,color);
 
f_r=f_r+d_r;
f_g=f_g+d_g;
f_b=f_b+d_b;
 
r=(char)f_r;
g=(char)f_g;
b=(char)f_b;
 
j=j+dj;
}
 
}
 
//---------------------------------------------------------------------------------
// libGUI function drawing circle on screen
//---------------------------------------------------------------------------------
void DrawCircle(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)
{
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;i<r;i++)
{
xl=xc;
xr=xc+1;
j=0;
//fill left up
while((pixcolor=GetColorPixel(xl,yu))!=color)
{
DrawPixel(xl,yu,color);
xl--;
j++;
if (j>r) 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<r;i++)
{
xl=xc;
xr=xc+1;
//fill left up
for(j=0;j<r;j++)
{
if (xl>=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<r;j++)
{
if (xr>=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<r;j++)
{
if (xl>=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<r;j++)
{
if (xr>=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;i<b;i++)
{
xl=xc;
xr=xc+1;
j=0;
//fill left up
while((pixcolor=GetColorPixel(xl,yu))!=color)
{
DrawPixel(xl,yu,color);
xl--;
j++;
if (j>a) 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<b;i++)
{
xl=xc;
xr=xc+1;
//fill left up
for(j=0;j<a;j++)
{
if (xl>=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<a;j++)
{
if (xr>=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<a;j++)
{
if (xl>=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<a;j++)
{
if (xr>=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;i<j;i++)
{
*(char*)ptr_screen=*(char*)ptr_src;
*((char*)ptr_screen+1)=*((char*)ptr_src+1);
*((char*)ptr_screen+2)=*((char*)ptr_src+2);
 
ptr_src+=4;
ptr_screen+=3;
}
gui_ksys_put_image_window(ptr_screen2,x,y,countx,county);
free(ptr_screen2);
}
break;
}
case 24:
{
gui_ksys_put_image_window(img,x,y,countx,county);
break;
}
default: break;
}
break;
}
case DRAW_OUTPUT_BUFFER:
{
switch(screen.bits_per_pixel)
{
case 24:
{//check source image resolution
switch(bits_per_pixel)
{
case 32://display 32 bit image in 24 bit mode
{
pitch_screen=screen.size_x*3;
pitch_src=countx << 2;
ptr_screen=screen.buffer+pitch_screen*y+x*3;
ptr_src=img;
add_screen=pitch_screen-pitch_src;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<pitch_src;j++)
{
*(char*)ptr_screen=*(char*)ptr_src;
ptr_src++;
ptr_screen++;
}
ptr_screen+=add_screen;
}
break;
}
case 24://display 24 bit image in 24 bit mode
{
pitch_screen=screen.size_x*3;
pitch_src=countx*3;
ptr_screen=screen.buffer+pitch_screen*y+x*3;
ptr_src=img;
add_screen=pitch_screen-pitch_src;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<pitch_src;j++)
{
*(char*)ptr_screen=*(char*)ptr_src;
ptr_src++;
ptr_screen++;
}
ptr_screen+=add_screen;
}
break;
}
default: break;
}
break;
}
case 32:
{ //check source image resolution
switch(bits_per_pixel)
{
case 32://display 32 bit image in 32 bit mode
{
pitch_screen=screen.size_x << 2;
pitch_src=countx << 2;
ptr_screen=screen.buffer+pitch_screen*y+x*4;
ptr_src=img;
add_screen=pitch_screen-pitch_src;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<pitch_src;j++)
{
*(char*)ptr_screen=*(char*)ptr_src;
ptr_src++;
ptr_screen++;
}
ptr_screen+=add_screen;
}
break;
}
case 24://display 24 bit image in 32 bit mode
{
break;
}
default: break;
}
default: break;
}
}
}
}
}
 
//---------------------------------------------------------------------------------
// libGUI function drawing image on screen with finition
//---------------------------------------------------------------------------------
void DrawImageFinit(finition_t *fin,int x,int y,int sizex,int sizey,char bits_per_pixel,char *img)
{
int x1,y1,x2,y2,sx,sy;
int xmin,xmax,ymin,ymax;
int countline,countx,county,i,j;
DWORD pitch_src,add_src;
char *ptr_dest,*ptr_src;
char bytes_per_pixel;
char *buf;
 
xmin=fin->x;
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 (x2<xmin) return;
if (x1>xmax) return;
if (y2<ymin) return;
if (y1>ymax) 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;i<county;i++)
{
for(j=0;j<countline;j++)
{
*(char*)ptr_dest=*(char*)ptr_src;
ptr_dest++;
ptr_src++;
}
 
ptr_src+=add_src;
}
break;
}
default: break;
}
//draw cutted by finition image
DrawImage(x1,y1,countx,county,bits_per_pixel,buf);
free(buf);
}
 
//---------------------------------------------------------------------------------
// libGUI function draw
//---------------------------------------------------------------------------------
void Draw(struct FINITION *finition,int tool_name,...)
{
va_list arguments;
char *img;
char first,second,bits_per_pixel;
int xmin,xmax,ymin,ymax;
int radius;
int x,y,x2,y2,x_i,y_i;
int sizex,sizey,sx,sy;
float x_l1,y_l1,x_l2,y_l2,k,b;
DWORD color,color_from,color_to;
 
arguments=(va_list)&tool_name+sizeof(int);
 
xmin=finition->x;
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 (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) 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 (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) 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 (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) 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 (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) 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 (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) 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 (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) 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);
}
 
 
Property changes:
Added: svn:executable
/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);
 
 
Property changes:
Added: svn:executable
/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;k<len;k++)
{
c=s[k];
p=font->font+step*c;
for(j=0;j<font->sizey;j++)
{
 
for(i=0;i<font->sizex;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;k<len;k++)
{
c=s[k];
p=font->font+step*c;
for(j=0;j<font->sizey;j++)
{
 
for(i=0;i<font->sizex;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;k<len;k++)
{
c=s[k];
p=font->font+step*c;
for(j=0;j<font->sizey;j++)
{
 
for(i=0;i<font->sizex;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);
}
Property changes:
Added: svn:executable
/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
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/kolibri_system.h
0,0 → 1,658
/*
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__(
+ :"=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));
+}
+
Property changes:
Added: svn:executable
/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;
}
 
Property changes:
Added: svn:executable
/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},
};
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/libGUI.h
0,0 → 1,581
/*
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
+
+};
+#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);
Property changes:
Added: svn:executable
/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 (x2<xmin) return(FALSE);
if (x>xmax) return(FALSE);
if (y2<ymin) return(FALSE);
if (y>ymax) 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);
}
Property changes:
Added: svn:executable
/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;i<WindowParent->number_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);
}
 
}
}
Property changes:
Added: svn:executable
/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();
}
Property changes:
Added: svn:executable
/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)
 
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/stdio.h
0,0 → 1,4
 
+
+
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/stdio.inc
0,0 → 1,791
/*
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<fmt2;i++)
{n=n*10;mul=mul*10;}
 
n=n*10;
n=ceil(n);
intdigit=floor(n);
//intdigit=n;
intdigit=(intdigit/10);
 
pos=0;
mul=mul/10;
for(i=0;i<fmt2-1;i++)
{
div=intdigit/mul;
buf[pos]=(char)div;
pos++;
intdigit=intdigit-div*mul;
mul=mul/10;
if (mul==1) break;
}
buf[pos]=(char)intdigit;
*s='0';s++;
*s='.';s++;
for(i=0;i<format2;i++)
{
if ((buf[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<fmt1-1;i++)
{
div=beforpointdigit/mul;
buf[pos]=(char)div;
pos++;
beforpointdigit=beforpointdigit-div*mul;
mul=mul/10;
if (mul==1) break;
}
buf[pos]=(char)beforpointdigit;
 
for(i=0;i<fmt1;i++)
{
if ((buf[i]>=0) && (buf[i]<=9)) {*s='0'+buf[i];}
s++;
}
 
//print part of number after point
mul=1;
for(i=0;i<fmt2;i++)
{nafter=nafter*10;mul=mul*10;}
 
nafter=nafter*10;
nafter=ceil(nafter);
intdigit=floor(nafter);
//intdigit=nafter;
intdigit=intdigit/10;
 
pos=0;
mul=mul/10;
for(i=0;i<fmt2-1;i++)
{
div=intdigit/mul;
buf[pos]=(char)div;
pos++;
intdigit=intdigit-div*mul;
mul=mul/10;
if (mul==1) break;
}
buf[pos]=(char)intdigit;
*s='.';s++;
for(i=0;i<format2;i++)
{
if ((buf[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<fmt-1;i++)
{
div=digit/mul;
buf[pos]=(char)div;
pos++;
digit=digit-div*mul;
mul=mul/10;
if (mul==1) break;
}
buf[pos]=(char)digit;
 
if (fmt1>=difference_pos) fmt=fmt1;
else
fmt=difference_pos;
 
for(i=0;i<fmt;i++)
{
if (i<difference_pos)
{
if ((buf[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(pos<maxlen)
{
if (*fmt=='%')
{
 
if (*(fmt+1)=='%')
{
*s='%';
s++;
fmt=fmt+2;
pos++;
goto exit_check;
}
//checking to containg format in the string
fmtc=fmt;
posc=pos;
format_flag=0;
flag_long=0;
flag_unsigned=0;
flag_register=0;
flag_plus=0;
while((*fmtc!='\0') || (*fmtc!=0))
{
fmtc++;
posc++;
switch(*fmtc)
{
case 'c':
case 'C':
format_flag=1;
break;
case 'd':
case 'D':
case 'i':
case 'I':
format_flag=1;
break;
case 'e':
format_flag=1;
break;
case 'E':
format_flag=1;
flag_long=1;
break;
case 'f':
format_flag=1;
break;
case 'F':
format_flag=1;
flag_long=1;
break;
case 'g':
format_flag=1;
break;
case 'G':
format_flag=1;
flag_long=1;
break;
case 'l':
flag_long=1;
break;
case 'L':
flag_long=2;
break;
case 'o':
format_flag=1;
break;
case 's':
case 'S':
format_flag=1;
break;
case 'u':
case 'U':
format_flag=1;
flag_unsigned=1;
break;
case 'x':
format_flag=1;
break;
case 'X':
flag_register=1;
format_flag=1;
break;
case 'z':
case 'Z':
format_flag=1;
flag_unsigned=1;
break;
case '+':
flag_plus=1;
break;
 
default:;
}
if ((*fmtc=='%') || (*fmtc==' ')) break;
if (format_flag==1) break;
}
 
if (format_flag==0)
{
*s=*fmt;
fmt++;
s++;
pos++;
}
else
{
if ((posc-pos)==1)
{//simbols % and format simbol near tothere(for example %c )
fmt=fmtc+1;
switch(*fmtc)
{
case 'c':
case 'C':
if ((pos+1)<maxlen)
{
//*s=(int)va_arg(argp,char*);
*s=*((char *)argp);
argp=argp+4;
*s++;pos++;
}
break;
case 's':
case 'S':
str=va_arg(argp,char*);
length=strlen(str);
if ((pos+length)<maxlen)
{
memmove(s,str,length);
s=s+length;pos=pos+length;
}
break;
case 'd':
case 'D':
case 'i':
case 'I':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
//intdigit=*((long*)argp);
//argp=argp+4;
if ((intdigit>0) && (flag_plus==1) && (pos+1<maxlen))
{
*s='+';
s++;
pos++;
}
length=formatted_long_to_string(intdigit,0,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'o':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
//intdigit=*((long int *)argp);
//argp=argp+4;
 
length=formatted_octa_to_string(intdigit,0,flag_register,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'u':
case 'U':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long int);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
 
if (flag_unsigned==1) {
if (intdigit<0) {intdigit=-intdigit;}
}
 
length=formatted_long_to_string(intdigit,0,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'x':
case 'X':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
//intdigit=*((long int *)argp);
//argp=argp+4;
 
length=formatted_hex_to_string(intdigit,0,flag_register,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'z':
case 'Z':
intdigit=va_arg(argp,size_t);
 
if (flag_unsigned==1) {
if (intdigit<0) {intdigit=-intdigit;}
}
 
length=formatted_long_to_string(intdigit,0,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
default:;
 
}
}
else
{
fmt++;
flag_point=0;
flag_noformat=0;
fmt1=0;
fmt2=0;
j=0;
k=0;
for(i=pos+1;i<posc;i++)
{
switch(*fmt)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (flag_point==0)
{
buffmt1[j]=*fmt-'0';
j++;
}
else
{
buffmt2[k]=*fmt-'0';
k++;
}
break;
case '.':
flag_point=1;
break;
case 'l':
case 'L':
break;
case '+':
break;
default:flag_noformat=1;
}
if (flag_noformat==1) break;
fmt++;
}
if (flag_noformat==0)
{
stepen=1;
for(i=j-1;i>=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)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'd':
case 'D':
case 'i':
case 'I':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
 
if ((intdigit>0) && (flag_plus==1) && (pos+1<maxlen))
{
*s='+';
s++;
pos++;
}
length=formatted_long_to_string(intdigit,fmt1,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'o':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
length=formatted_octa_to_string(intdigit,fmt1,flag_register,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'u':
case 'U':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long int);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
 
if (flag_unsigned==1) {
if (intdigit<0) {intdigit=-intdigit;}
}
 
length=formatted_long_to_string(intdigit,fmt1,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'x':
case 'X':
if (flag_long==0) {intdigit=va_arg(argp,int);}
if (flag_long==1) {intdigit=va_arg(argp,long int);}
if (flag_long==2) {intdigit=va_arg(argp,long long);}
length=formatted_hex_to_string(intdigit,fmt1,flag_register,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
case 'z':
case 'Z':
intdigit=va_arg(argp,size_t);
 
if (flag_unsigned==1) {
if (intdigit<0) {intdigit=-intdigit;}
}
 
length=formatted_long_to_string(intdigit,fmt1,buf);
if ((pos+length)<maxlen)
{
memmove(s,buf,length);
s=s+length;pos=pos+length;
}
break;
default:;
}
}
fmt=fmtc+1;
}
}
}
else
{
if (*fmt=='\0') {break;}
*s=*fmt;
fmt++;
s++;
pos++;
}
exit_check:;
}
return(pos);
}
static char* dllname="/rd/1/lib/console.obj";
int console_init_status=0;
 
static char* imports[] = {"START","version","con_init","con_write_asciiz","con_printf","con_exit"};
static char* caption = "Console";
 
static DWORD (stdcall *dll_ver)(void);
static void (stdcall *con_init)(DWORD wnd_width, DWORD wnd_height, DWORD scr_width, DWORD scr_height, const char* title);
static void (stdcall *con_write_asciiz)(const char* string);
static void (cdecl *con_printf)(const char* format,...);
static void (stdcall *con_exit)(DWORD bCloseWindow);
 
static void printf_link(import_t *exp, char** imports)
{
dll_ver = (DWORD (stdcall *)(void))
gui_cofflib_getproc(exp, imports[1]);
con_init = (void (stdcall *)(DWORD , DWORD, DWORD, DWORD, const char*))
gui_cofflib_getproc(exp, imports[2]);
con_printf = (void (cdecl *)(const char*,...))
(exp, imports[4]);
con_exit = (void (stdcall *)(DWORD))
gui_cofflib_getproc(exp, imports[5]);
}
 
static int init_console(void)
{
import_t *hDll;
 
if((hDll = (import_t*)gui_ksys_load_dll(dllname)) == 0)
{
gui_debug_out_str("can't load lib\n");
return 1;
}
printf_link(hDll, imports);
 
con_init(-1, -1, -1, -1, caption);
return(0);
}
 
 
static int printf(const char *format,...)
{
int i;
int printed_simbols;
va_list arg;
static char simbol[]={"%s"};
char *s;
 
va_start(arg,format);
 
/*
if (console_init_status==0)
{
i=init_console();
console_init_status=1;
}
*/
s=malloc(4096);
printed_simbols=format_print(s,4096,format,arg);
+ //con_printf(simbol,s);
+ free(s);
+
+ return(printed_simbols);
+}
+
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/stdlib.h
0,0 → 1,9
/*
some standart libC helper functions
*/
 
static void* malloc(DWORD size);
static void free(void *memory);
static void* realloc(void *old_mem,DWORD new_size);
static void exit(int c);
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/stdlib.inc
0,0 → 1,24
/*
some standart libC helper functions
*/
 
static void* malloc(DWORD size)
{
return(gui_ksys_malloc(size));
}
 
static void free(void *memory)
{
gui_ksys_free(memory);
}
 
static void* realloc(void *old_mem,DWORD new_size)
{
return(gui_ksys_realloc(new_size,old_mem));
}
 
static void exit(int c)
{
gui_ksys_exit(c);
}
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/string.h
0,0 → 1,16
/*
some libC function working with memory
*/
 
static void *memmove(void *dst,const void *src,size_t length);
static size_t strlen(const char *s);
static char* strchr(const char *string, int c);
static char* strrchr(const char *string, int c);
static char* strstr(const char *s1,const char *s2);
static int strcmp(const char*,const char*);
static int strncmp(const char* string1, const char* string2, int count);
 
static int vsnprintf(char *dest, size_t size,const char *format,va_list ap);
static int cdecl snprintf(char *dest, size_t size, const char *format,...);
static int cdecl sprintf(char *dest,const char *format,...);
 
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/SRC/string.inc
0,0 → 1,134
/*
some libC function working with memory
*/
 
static void *memmove(void *dst,const void *src,size_t length)
{
void *value;
 
__asm__ __volatile__(
"movl %%edi,%%eax\n\t"
"cld\n\t"
"rep\n\t"
"movsb"
:"=D"(value)
:"c"(length),"S"(src),"D"(dst)
:"eax");
 
return(value);
}
 
static size_t strlen(const char *s)
{
size_t i;
 
i=0;
while(*s!='\0')
{
i++;
s++;
}
return(i);
}
 
static char* strchr(const char *string, int c)
{
while(*string!='\0')
{
if (*string==(char)c) return((char*)string);
string++;
}
return(NULL);
}
 
static char* strrchr(const char *string, int c)
{
char *s;
int i,j;
 
s=(char*)string;
while(*s!='\0') {s++;}
 
j=(int)(s-string);
s--;
 
for(i=0;i<j;i++)
{
if (*s==(char)c) return(s);
s--;
}
 
return(NULL);
}
 
static char* strstr(const char *s1,const char *s2)
{
char *s;
int i,j,len1,len2;
 
len2=strlen(s2);
if (len2==0) return((char*)s1);
 
len1=strlen(s1);
for(i=0;i<len1-len2+1;i++)
{
if (s1[i]==s2[0])
{
for(j=0;j<len2;j++)
{
if (s1[i+j]!=s2[j]) break;
}
if (j==len2) return((char*)(s1+i));
}
}
return(NULL);
}
 
static int 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 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);
}
 
 
Property changes:
Added: svn:executable
/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
Property changes:
Added: svn:executable
/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);
}
Property changes:
Added: svn:executable
/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;i<GetControlSizeY(image);i++)
{
for(j=0;j<GetControlSizeX(image);j++)
{
*img=100*(i*i+j*j-i*3+2*j);
img++;
}
}
//pack image in window
PackControls(window,image);
//start main libGUI loop
LibGUImain(window);
}
Property changes:
Added: svn:executable
/programs/develop/new libGUI_C/examples/src/progress_bar.c
0,0 → 1,66
/*
test libGUI library
*/
#include "stdarg.h"
#include "libGUI.h"
#include "string.h"
 
 
void callback_func_delete_window(header_t *control,void *data)
{
QuitLibGUI((parent_t*)control);
}
 
void ProgressBarCallback(void *data)
{
gui_progress_bar_t *progress_bar;
int progress;
static char txt[16];
progress_bar=(gui_progress_bar_t*)data;
progress_bar->progress+=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);
}
Property changes:
Added: svn:executable
/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);
}
Property changes:
Added: svn:executable
/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);
}
Property changes:
Added: svn:executable
/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);
}