0,0 → 1,134 |
#ifndef KOLIBRI_GUI_H |
#define KOLIBRI_GUI_H |
|
#include <stdlib.h> /* for malloc() */ |
#include <kos32sys.h> |
|
#include "kolibri_debug.h" /* work with debug board */ |
|
/* boxlib loader */ |
#include "kolibri_boxlib.h" |
|
/* All supported GUI elements included */ |
#include "kolibri_gui_elements.h" |
|
enum KOLIBRI_GUI_EVENTS { |
KOLIBRI_EVENT_REDRAW = 1, /* Window and window elements should be redrawn */ |
KOLIBRI_EVENT_KEY = 2, /* A key on the keyboard was pressed */ |
KOLIBRI_EVENT_BUTTON = 3, /* A button was clicked with the mouse */ |
KOLIBRI_EVENT_MOUSE = 6 /* Mouse activity (movement, button press) was detected */ |
}; |
|
void kolibri_handle_event_redraw(struct kolibri_window* some_window) |
{ |
/* Draw windows with system color table. */ |
|
BeginDraw(); |
|
DrawWindow(some_window->topleftx, some_window->toplefty, |
some_window->sizex, some_window->sizey, |
some_window->window_title, |
kolibri_color_table.color_work_area, some_window->XY); |
|
/* Enumerate and draw all window elements here */ |
if(some_window->elements) /* Draw all elements added to window */ |
{ |
struct kolibri_window_element* current_element = some_window -> elements; |
|
do |
{ |
/* The redraw_fn serves as draw_fn on initial draw */ |
if(kolibri_gui_op_table[current_element -> type].redraw_fn) |
kolibri_gui_op_table[current_element -> type].redraw_fn(current_element -> element); |
|
//sie after fixing calling conventions no more needed |
/* |
switch(current_element -> type) |
{ |
case KOLIBRI_EDIT_BOX: |
case KOLIBRI_CHECK_BOX: |
__asm__ volatile("push $0x13371337"::); / * Random value pushed to balance stack * / |
/ * otherwise edit_box_draw leaves stack unbalanced * / |
/ * and GCC jumps like a crazy motha' fucka' * / |
|
break; |
} |
*/ |
current_element = current_element -> next; |
|
} while(current_element != some_window->elements); /* Have we covered all elements? */ |
} |
} |
|
void kolibri_handle_event_key(struct kolibri_window* some_window) |
{ |
/* Enumerate and trigger key handling functions of window elements here */ |
if(some_window->elements) |
{ |
struct kolibri_window_element *current_element = some_window -> elements; |
|
do |
{ |
/* Only execute if the function pointer isn't NULL */ |
if(kolibri_gui_op_table[current_element -> type].key_fn) |
kolibri_gui_op_table[current_element -> type].key_fn(current_element -> element); |
|
current_element = current_element -> next; |
} while(current_element != some_window->elements); /* Have we covered all elements? */ |
} |
} |
|
void kolibri_handle_event_mouse(struct kolibri_window* some_window) |
{ |
/* Enumerate and trigger mouse handling functions of window elements here */ |
if(some_window->elements) |
{ |
struct kolibri_window_element *current_element = some_window -> elements; |
|
do |
{ |
if(kolibri_gui_op_table[current_element -> type].mouse_fn) |
kolibri_gui_op_table[current_element -> type].mouse_fn(current_element -> element); |
|
current_element = current_element -> next; |
|
} while(current_element != some_window->elements); /* Have we covered all elements? */ |
} |
} |
|
void kolibri_exit(void) |
{ |
__asm__ volatile ("int $0x40"::"a"(-1)); |
} |
|
int kolibri_gui_init(void) |
{ |
int boxlib_init_status = kolibri_boxlib_init(); |
|
if(boxlib_init_status == 0) |
debug_board_write_str("ashmew2 is happy: Kolibri GUI Successfully Initialized.\n"); |
else |
{ |
debug_board_write_str("ashmew2 is sad: Kolibri GUI Failed to initialize.\n"); |
kolibri_exit(); |
} |
|
/* Initialize the global operation table which handles event functions of */ |
/* each individual element type */ |
kolibri_init_gui_op_table(); |
|
/* Get the current color table for Kolibri and store in global table*/ |
kolibri_get_system_colors(&kolibri_color_table); |
|
/* Set up system events for buttons, mouse and keyboard and redraw */ |
/* Also set filters so that window receives mouse events only when active |
and mouse inside window */ |
__asm__ volatile("int $0x40"::"a"(40), "b"(0xC0000027)); |
|
return boxlib_init_status; |
} |
|
/* Note: The current implementation tries to automatically colors |
GUI elements with system theme */ |
|
#endif /* KOLIBRI_GUI_H */ |