commit eda322494fb1c420add7e80bf9ec112c8574f3b4
parent f8162695f7e3ea7d517610987a5fbc614f515878
Author: lumidify <nobody@lumidify.org>
Date:   Mon,  2 Jan 2017 08:37:09 +0100
Update event system
Diffstat:
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;