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;