diff options
Diffstat (limited to 'framebuffer')
-rw-r--r-- | framebuffer/fb_cursor.c | 24 | ||||
-rw-r--r-- | framebuffer/fb_cursor.h | 4 | ||||
-rw-r--r-- | framebuffer/fb_frontend_linuxfb.c | 7 | ||||
-rw-r--r-- | framebuffer/fb_frontend_sdl.c | 11 | ||||
-rw-r--r-- | framebuffer/fb_gui.c | 10 | ||||
-rw-r--r-- | framebuffer/fb_rootwindow.c | 42 | ||||
-rw-r--r-- | framebuffer/fb_rootwindow.h | 6 |
7 files changed, 72 insertions, 32 deletions
diff --git a/framebuffer/fb_cursor.c b/framebuffer/fb_cursor.c index a9e61ba9a..71b8deeb5 100644 --- a/framebuffer/fb_cursor.c +++ b/framebuffer/fb_cursor.c @@ -258,25 +258,17 @@ fb_cursor_init(framebuffer_t *fb) return cursor; } -void -fb_cursor_click(framebuffer_t *fb, - struct gui_window *g, - browser_mouse_state st) +int fb_cursor_x(framebuffer_t *fb) { - /* check click lies within window */ - if ((fb->cursor->x > g->x) && - (fb->cursor->y > g->y) && - (fb->cursor->x < g->x + g->width) && - (fb->cursor->y < g->y + g->height)) { - browser_window_mouse_click(g->bw, - st, - fb->cursor->x - g->x + g->scrollx, - fb->cursor->y - g->y + g->scrolly); - } else { - fb_rootwindow_click(fb, g, st, fb->cursor->x, fb->cursor->y); - } + return fb->cursor->x; +} + +int fb_cursor_y(framebuffer_t *fb) +{ + return fb->cursor->y; } + /* * Local Variables: * c-basic-offset:8 diff --git a/framebuffer/fb_cursor.h b/framebuffer/fb_cursor.h index 85fdeb62d..6451094fc 100644 --- a/framebuffer/fb_cursor.h +++ b/framebuffer/fb_cursor.h @@ -19,6 +19,10 @@ #ifndef FRAMEBUFFER_FB_CURSOR #define FRAMEBUFFER_FB_CURSOR +int fb_cursor_x(framebuffer_t *fb); + +int fb_cursor_y(framebuffer_t *fb); + void fb_cursor_move(struct framebuffer_s *fb, int x, int y); void fb_cursor_move_abs(struct framebuffer_s *fb, int x, int y); diff --git a/framebuffer/fb_frontend_linuxfb.c b/framebuffer/fb_frontend_linuxfb.c index 08be46de6..b1e89c537 100644 --- a/framebuffer/fb_frontend_linuxfb.c +++ b/framebuffer/fb_frontend_linuxfb.c @@ -638,9 +638,10 @@ void fb_os_input(struct gui_window *g, bool active) fb_cursor_move(framebuffer, 1, 0); break; case BTN_LEFT: - fb_cursor_click(framebuffer, - g, - BROWSER_MOUSE_CLICK_1); + fb_rootwindow_click(g, + BROWSER_MOUSE_CLICK_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); break; } } else if (event.type == EV_REL) { diff --git a/framebuffer/fb_frontend_sdl.c b/framebuffer/fb_frontend_sdl.c index 98593929c..dd8ee2e06 100644 --- a/framebuffer/fb_frontend_sdl.c +++ b/framebuffer/fb_frontend_sdl.c @@ -36,6 +36,7 @@ #include "framebuffer/fb_plotters.h" #include "framebuffer/fb_frontend.h" #include "framebuffer/fb_cursor.h" +#include "framebuffer/fb_rootwindow.h" #include "utils/log.h" @@ -146,11 +147,17 @@ void fb_os_input(struct gui_window *g, bool active) switch (event.button.button) { case SDL_BUTTON_LEFT: - fb_cursor_click(framebuffer, g, BROWSER_MOUSE_CLICK_1); + fb_rootwindow_click(g, + BROWSER_MOUSE_CLICK_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); break; case SDL_BUTTON_RIGHT: - fb_cursor_click(framebuffer, g, BROWSER_MOUSE_CLICK_2); + fb_rootwindow_click(g, + BROWSER_MOUSE_CLICK_2, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); break; case SDL_BUTTON_WHEELUP: diff --git a/framebuffer/fb_gui.c b/framebuffer/fb_gui.c index b97c02392..e8bd74b93 100644 --- a/framebuffer/fb_gui.c +++ b/framebuffer/fb_gui.c @@ -279,6 +279,15 @@ void gui_quit(void) #endif } +static int +fb_browser_window_click(struct gui_window *g, browser_mouse_state st, int x, int y) +{ + browser_window_mouse_click(g->bw, + st, + x - g->x + g->scrollx, + y - g->y + g->scrolly); + return 0; +} struct gui_window *gui_create_browser_window(struct browser_window *bw, struct browser_window *clone, @@ -299,6 +308,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, if (window_list == NULL) { window_list = input_window = g; + fb_add_window_widget(g, fb_browser_window_click); } else { for(p = window_list; p->next != NULL; p = p->next); p->next = g; diff --git a/framebuffer/fb_rootwindow.c b/framebuffer/fb_rootwindow.c index 0752e6132..bff5c05c8 100644 --- a/framebuffer/fb_rootwindow.c +++ b/framebuffer/fb_rootwindow.c @@ -355,7 +355,6 @@ static const fb_widget_image_t reload = { }; -typedef int (*fb_widget_mouseclick_t)(framebuffer_t *fb, struct gui_window *g); struct fb_widget { struct fb_widget *next; @@ -365,11 +364,11 @@ struct fb_widget { int height; fb_widget_mouseclick_t click; struct bitmap *bitmap; + struct gui_window *g; }; static struct fb_widget *widget_list; - static struct fb_widget * fb_add_button_widget(int x, int y, @@ -411,9 +410,33 @@ fb_add_button_widget(int x, return new_widget; } +struct fb_widget * +fb_add_window_widget(struct gui_window *g, + fb_widget_mouseclick_t click_rtn) +{ + struct fb_widget *new_widget; + new_widget = malloc(sizeof(struct fb_widget)); + if (new_widget == NULL) + return NULL; + + new_widget->x = g->x; + new_widget->y = g->y; + new_widget->width = g->width; + new_widget->height = g->height; + new_widget->click = click_rtn; + + new_widget->bitmap = NULL; + new_widget->g = g; + + new_widget->next = widget_list; + widget_list = new_widget; + + return new_widget; +} + /* left icon click routine */ static int -fb_widget_leftarrow_click(framebuffer_t *fb, struct gui_window *g) +fb_widget_leftarrow_click(struct gui_window *g, browser_mouse_state st, int x, int y) { if (history_back_available(g->bw->history)) history_back(g->bw, g->bw->history); @@ -423,7 +446,7 @@ fb_widget_leftarrow_click(framebuffer_t *fb, struct gui_window *g) /* right arrow icon click routine */ static int -fb_widget_rightarrow_click(framebuffer_t *fb, struct gui_window *g) +fb_widget_rightarrow_click(struct gui_window *g, browser_mouse_state st, int x, int y) { if (history_forward_available(g->bw->history)) history_forward(g->bw, g->bw->history); @@ -466,21 +489,20 @@ void fb_rootwindow_create(framebuffer_t *fb) fb_plot_ctx = saved_plot_ctx; } -void fb_rootwindow_click(framebuffer_t *fb, - struct gui_window *g, - browser_mouse_state st , - int x, int y) +void +fb_rootwindow_click(struct gui_window *g, browser_mouse_state st, int x, int y) { struct fb_widget *widget; LOG(("Click in root window")); widget = widget_list; while (widget != NULL) { - if ((x > widget->x) && + if ((widget->click != NULL) && + (x > widget->x) && (y > widget->y) && (x < widget->x + widget->width) && (y < widget->y + widget->height)) { - widget->click(fb, g); + widget->click(g, st, x, y); break; } widget = widget->next; diff --git a/framebuffer/fb_rootwindow.h b/framebuffer/fb_rootwindow.h index 0a4ebe867..a0db2af33 100644 --- a/framebuffer/fb_rootwindow.h +++ b/framebuffer/fb_rootwindow.h @@ -16,5 +16,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -void fb_rootwindow_click(framebuffer_t *fb, struct gui_window *g,browser_mouse_state st , int x, int y); +typedef int (*fb_widget_mouseclick_t)(struct gui_window *g, browser_mouse_state st, int x, int y); + +void fb_rootwindow_click(struct gui_window *g, browser_mouse_state st , int x, int y); void fb_rootwindow_create(framebuffer_t *fb); + +struct fb_widget *fb_add_window_widget(struct gui_window *g, fb_widget_mouseclick_t click_rtn); |