From 4693d1d70855b97d57cdbe92552ba304362fb453 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Fri, 06 Aug 2021 09:14:08 -0400 Subject: tk: Implement focusing by mouse --- diff --git a/src/tk/button.c b/src/tk/button.c index a236dd4..0b5e874 100644 --- a/src/tk/button.c +++ b/src/tk/button.c @@ -51,6 +51,7 @@ _mftk_button_event(struct mftk_widget *w, SDL_Event *e, switch (e->type) { case SDL_MOUSEBUTTONUP: if (e->button.button == SDL_BUTTON_LEFT) { + mftk_window_focus(w->window, w); if (b->action == NULL) { return 0; } diff --git a/src/tk/check.c b/src/tk/check.c index a2eadd0..fbd3b23 100644 --- a/src/tk/check.c +++ b/src/tk/check.c @@ -81,6 +81,7 @@ _mftk_check_event(struct mftk_widget *w, SDL_Event *e, switch (e->type) { case SDL_MOUSEBUTTONUP: if (e->button.button == SDL_BUTTON_LEFT) { + mftk_window_focus(w->window, w); c->state = !c->state; if (c->action == NULL) { return 0; diff --git a/src/tk/radio.c b/src/tk/radio.c index 11acbae..6f767af 100644 --- a/src/tk/radio.c +++ b/src/tk/radio.c @@ -75,6 +75,16 @@ _mftk_radio_event(struct mftk_widget *w, SDL_Event *e, int x, int y) { struct mftk_radio *r = (struct mftk_radio *) w; + switch (e->type) { + case SDL_MOUSEBUTTONUP: + if (e->button.button == SDL_BUTTON_LEFT) { + mftk_window_focus(w->window, w); + } + break; + default: + break; + } + return mftk_widget_event(r->grid, e, x, y); } diff --git a/src/tk/text.c b/src/tk/text.c index 052beeb..88b8e37 100644 --- a/src/tk/text.c +++ b/src/tk/text.c @@ -55,8 +55,20 @@ _mftk_text_event(struct mftk_widget *w, SDL_Event *e, { struct mftk_text *t = (struct mftk_text *) w; - /* TODO */ - t->texture = NULL; + switch (e->type) { + case SDL_KEYDOWN: + /* TODO */ + t->texture = NULL; + break; + case SDL_MOUSEBUTTONUP: + if (e->button.button == SDL_BUTTON_LEFT) { + mftk_window_focus(w->window, w); + } + break; + default: + break; + } + return 0; } diff --git a/src/tk/widget.h b/src/tk/widget.h index 83abe0b..27400c4 100644 --- a/src/tk/widget.h +++ b/src/tk/widget.h @@ -26,6 +26,9 @@ void mftk_window_index(struct mftk_window *win, struct mftk_widget *wid); +void +mftk_window_focus(struct mftk_window *win, struct mftk_widget *wid); + enum mftk_widget_role { MFTK_WIDGET_ROLE_NONE, MFTK_WIDGET_ROLE_FOCUSABLE, diff --git a/src/tk/window.c b/src/tk/window.c index 61c017f..53fbb41 100644 --- a/src/tk/window.c +++ b/src/tk/window.c @@ -100,6 +100,14 @@ mftk_window_event(struct mftk_window *w, SDL_Event *e) return 0; } +void +mftk_window_focus(struct mftk_window *win, struct mftk_widget *wid) +{ + win->focus->focused = SDL_FALSE; + win->focus = wid; + win->focus->focused = SDL_TRUE; +} + int mftk_window_render(struct mftk_window *w, SDL_Renderer *renderer) { -- cgit v0.9.1