diff --git a/content/content.h b/content/content.h index 752370034..45c9c0452 100644 --- a/content/content.h +++ b/content/content.h @@ -84,6 +84,7 @@ typedef enum { CONTENT_MSG_SELECTION, /**< A selection made or cleared */ CONTENT_MSG_CARET, /**< Caret movement / hiding */ CONTENT_MSG_DRAG, /**< A drag started or ended */ + CONTENT_MSG_SELECTMENU,/**< Create a select menu */ CONTENT_MSG_GADGETCLICK/**< A gadget has been clicked on (mainly for file) */ } content_msg; @@ -197,6 +198,10 @@ union content_msg_data { } type; const struct rect *rect; } drag; + /** CONTENT_MSG_SELECTMENU - Create select menu at pointer */ + struct { + struct form_control *gadget; + } select_menu; /** CONTENT_MSG_GADGETCLICK - User clicked on a form gadget */ struct { struct form_control *gadget; diff --git a/desktop/browser.c b/desktop/browser.c index 9cbfb2a1f..ba24ea168 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -1600,6 +1600,16 @@ static nserror browser_window_callback(hlcache_handle *c, event->data.selection.read_only); break; + case CONTENT_MSG_SELECTMENU: + if (event->data.select_menu.gadget->type == GADGET_SELECT) { + struct browser_window *root = + browser_window_get_root(bw); + guit->browser->create_form_select_menu(root->window, + event->data.select_menu.gadget); + } + + break; + case CONTENT_MSG_GADGETCLICK: if (event->data.gadget_click.gadget->type == GADGET_FILE) { guit->window->file_gadget_open(bw->window, c, diff --git a/render/html_interaction.c b/render/html_interaction.c index 7e78fc034..781c9c1de 100644 --- a/render/html_interaction.c +++ b/render/html_interaction.c @@ -55,13 +55,6 @@ #include "render/imagemap.h" #include "render/search.h" -/* TODO: - * This is currently needed here because the forms stuff (select menu - * specifically) is badly designed. But I'd rather it were here in the - * core than in all the front ends. We should fix this so we communicate - * with the browser window layer via the content message system. -- tlsa */ -#include - /** * Get pointer shape for given box * @@ -665,10 +658,9 @@ void html_mouse_action(struct content *c, struct browser_window *bw, c); pointer = BROWSER_POINTER_DEFAULT; } else if (mouse & BROWSER_MOUSE_CLICK_1) { - struct browser_window *rbw = - browser_window_get_root(bw); - guit->browser->create_form_select_menu( - rbw->window, gadget); + msg_data.select_menu.gadget = gadget; + content_broadcast(c, CONTENT_MSG_SELECTMENU, + msg_data); } break; case GADGET_CHECKBOX: diff --git a/render/html_object.c b/render/html_object.c index d048253a7..455733d0a 100644 --- a/render/html_object.c +++ b/render/html_object.c @@ -375,6 +375,7 @@ html_object_callback(hlcache_handle *object, case CONTENT_MSG_SAVELINK: case CONTENT_MSG_POINTER: + case CONTENT_MSG_SELECTMENU: case CONTENT_MSG_GADGETCLICK: /* These messages are for browser window layer. * we're not interested, so pass them on. */