ltkx

GUI toolkit for X11 (WIP)
git clone git://lumidify.org/ltkx.git
Log | Files | Refs | README | LICENSE

commit eda322494fb1c420add7e80bf9ec112c8574f3b4
parent f8162695f7e3ea7d517610987a5fbc614f515878
Author: lumidify <nobody@lumidify.org>
Date:   Mon,  2 Jan 2017 08:37:09 +0100

Update event system

Diffstat:
Mbutton.c | 9++++-----
Mcommon.c | 12++++++++++++
Mcommon.h | 1+
Mgrid.c | 14+++++++++++---
Mwidget.c | 3++-
5 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/button.c b/button.c @@ -207,12 +207,11 @@ void ltk_destroy_button(void *widget) free(button); } -void ltk_button_key_event(void *widget, XEvent event) -{ -} - - void ltk_button_mouse_release(void *widget, XEvent event) { LtkButton *button = widget; + if (button->widget.state == HOVERACTIVE && button->callback) + { + button->callback(); + } } diff --git a/common.c b/common.c @@ -62,6 +62,18 @@ void ltk_remove_active_widget(void *widget) } } +/* Recursively set all active_widget states to state and redraw them */ +void ltk_change_active_widget_state(void *widget, LtkWidgetState state) +{ + if (!widget) return; + LtkWidget *ptr = widget; + while (ptr = ptr->active_widget) + { + ptr->state = state; + ptr->draw(ptr); + } +} + /* Recursively set all hover_widget states to NORMAL, redraw them, * and remove the references to them in their parent functions */ void ltk_remove_hover_widget(void *widget) diff --git a/common.h b/common.h @@ -47,6 +47,7 @@ typedef struct int ltk_collide_rect(LtkRect rect, int x, int y); char *ltk_read_file(const char *path); +void ltk_change_active_widget_state(void *widget, LtkWidgetState state); void ltk_remove_active_widget(void *widget); void ltk_remove_hover_widget(void *widget); diff --git a/grid.c b/grid.c @@ -306,9 +306,17 @@ ltk_grid_mouse_release(void *widget, XEvent event) int row = ltk_grid_find_nearest_row(grid, y); int column = ltk_grid_find_nearest_column(grid, x); LtkWidget *ptr = grid->widget_grid[row * grid->columns + column]; - if (ptr && ltk_collide_rect(ptr->rect, x, y)) + if (ptr) { - ltk_mouse_release_event(ptr, event); + if (ltk_collide_rect(ptr->rect, x, y)) + { + ltk_mouse_release_event(ptr, event); + } + else + { + ltk_remove_hover_widget(grid); + ltk_change_active_widget_state(grid, ACTIVE); + } } } @@ -324,7 +332,7 @@ ltk_grid_motion_notify(void *widget, XEvent event) { if (ltk_collide_rect(ptr->rect, x, y)) ltk_motion_notify_event(ptr, event); - else + else if ((event.xmotion.state & Button1Mask) != Button1Mask) ltk_remove_hover_widget(grid); } } diff --git a/widget.c b/widget.c @@ -62,7 +62,8 @@ void ltk_mouse_release_event(void *widget, XEvent event) void ltk_motion_notify_event(void *widget, XEvent event) { LtkWidget *ptr = widget; - if (!ptr || ptr->state == NORMAL || ptr->state == ACTIVE) + if (ptr && (ptr->state == NORMAL || ptr->state == ACTIVE) && + (event.xmotion.state & Button1Mask) != Button1Mask) { ptr->state = ptr->state == ACTIVE ? HOVERACTIVE : HOVER; LtkWidget *parent = ptr->parent;