URI: 
       tUpdate event system - ltkx - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltkx.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit eda322494fb1c420add7e80bf9ec112c8574f3b4
   DIR parent f8162695f7e3ea7d517610987a5fbc614f515878
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Mon,  2 Jan 2017 08:37:09 +0100
       
       Update event system
       
       Diffstat:
         M button.c                            |       9 ++++-----
         M common.c                            |      12 ++++++++++++
         M common.h                            |       1 +
         M grid.c                              |      14 +++++++++++---
         M widget.c                            |       3 ++-
       
       5 files changed, 30 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/button.c b/button.c
       t@@ -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();
       +    }
        }
   DIR diff --git a/common.c b/common.c
       t@@ -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)
   DIR diff --git a/common.h b/common.h
       t@@ -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);
        
   DIR diff --git a/grid.c b/grid.c
       t@@ -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);
       +        }
            }
        }
        
       t@@ -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);
            }
        }
   DIR diff --git a/widget.c b/widget.c
       t@@ -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;