summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2009-02-13 00:31:24 +0000
committerVincent Sanders <vince@netsurf-browser.org>2009-02-13 00:31:24 +0000
commitf32c4ff799e7a76eaa2eb9a8356033d7d4c34c4f (patch)
tree0676c53a37b7238c6f8c15d7494eee93d74d8cac
parente5c225f7d9c210ab970aee73d66d82874467c81d (diff)
downloadnetsurf-f32c4ff799e7a76eaa2eb9a8356033d7d4c34c4f.tar.gz
netsurf-f32c4ff799e7a76eaa2eb9a8356033d7d4c34c4f.tar.bz2
alter mouse click handling so browser window is uses the same interface
as other root window widgets svn path=/trunk/netsurf/; revision=6464
-rw-r--r--framebuffer/fb_cursor.c24
-rw-r--r--framebuffer/fb_cursor.h4
-rw-r--r--framebuffer/fb_frontend_linuxfb.c7
-rw-r--r--framebuffer/fb_frontend_sdl.c11
-rw-r--r--framebuffer/fb_gui.c10
-rw-r--r--framebuffer/fb_rootwindow.c42
-rw-r--r--framebuffer/fb_rootwindow.h6
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);