From 1e6345e562e2701d036dd953befd03273ea46b05 Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Fri, 20 Oct 2006 00:47:07 +0000 Subject: Allow textareas to reformat on icon change. svn path=/trunk/netsurf/; revision=3012 --- riscos/textarea.c | 108 +++++++++++++++++++++++++++++------------------------- riscos/textarea.h | 4 ++ 2 files changed, 63 insertions(+), 49 deletions(-) diff --git a/riscos/textarea.c b/riscos/textarea.c index 66b41fb94..f19e24301 100644 --- a/riscos/textarea.c +++ b/riscos/textarea.c @@ -123,9 +123,6 @@ uintptr_t textarea_create(wimp_w parent, wimp_i icon, unsigned int flags, rufl_style font_style) { struct text_area *ret; - wimp_window_state state; - wimp_icon_state istate; - os_box extent; os_error *error; ret = malloc(sizeof(struct text_area)); @@ -180,67 +177,95 @@ uintptr_t textarea_create(wimp_w parent, wimp_i icon, unsigned int flags, free(ret); return 0; } + + /* set the window dimensions */ + if (!textarea_update((uintptr_t)ret)) { + textarea_destroy((uintptr_t)ret); + return 0; + } - state.w = parent; + /* and register our event handlers */ + ro_gui_wimp_event_set_user_data(ret->window, ret); + ro_gui_wimp_event_register_mouse_click(ret->window, + textarea_mouse_click); + ro_gui_wimp_event_register_keypress(ret->window, + textarea_key_press); + ro_gui_wimp_event_register_redraw_window(ret->window, + textarea_redraw); + ro_gui_wimp_event_register_open_window(ret->window, + textarea_open); + + return (uintptr_t)ret; +} + +/** + * Update the a text area following a change in the parent icon + * + * \param self Text area to update + */ +bool textarea_update(uintptr_t self) +{ + struct text_area *ta; + wimp_window_state state; + wimp_icon_state istate; + os_box extent; + os_error *error; + + ta = (struct text_area *)self; + if (!ta || ta->magic != MAGIC) + return false; + + state.w = ta->parent; error = xwimp_get_window_state(&state); if (error) { LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); - free(ret->font_family); - free(ret->text); - free(ret); - return 0; + return false; } - istate.w = parent; - istate.i = icon; + istate.w = ta->parent; + istate.i = ta->icon; error = xwimp_get_icon_state(&istate); if (error) { LOG(("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess)); - free(ret->font_family); - free(ret->text); - free(ret); - return 0; + return false; } - state.w = ret->window; + state.w = ta->window; state.visible.x1 = state.visible.x0 + istate.icon.extent.x1 - - ro_get_vscroll_width(ret->window) - state.xscroll; + ro_get_vscroll_width(ta->window) - state.xscroll; state.visible.x0 += istate.icon.extent.x0 + 2 - state.xscroll; state.visible.y0 = state.visible.y1 + istate.icon.extent.y0 + - ro_get_hscroll_height(ret->window) - state.yscroll; + ro_get_hscroll_height(ta->window) - state.yscroll; state.visible.y1 += istate.icon.extent.y1 - 2 - state.yscroll; - if (flags & TEXTAREA_READONLY) { + if (ta->flags & TEXTAREA_READONLY) { state.visible.x0 += 2; state.visible.x1 -= 4; - state.visible.y0 += 4; - state.visible.y1 -= 2; + state.visible.y0 += 2; + state.visible.y1 -= 4; } /* set our width/height */ - ret->vis_width = state.visible.x1 - state.visible.x0; - ret->vis_height = state.visible.y1 - state.visible.y0; + ta->vis_width = state.visible.x1 - state.visible.x0; + ta->vis_height = state.visible.y1 - state.visible.y0; /* Set window extent to visible area */ extent.x0 = 0; - extent.y0 = -ret->vis_height; - extent.x1 = ret->vis_width; + extent.y0 = -ta->vis_height; + extent.x1 = ta->vis_width; extent.y1 = 0; - error = xwimp_set_extent(ret->window, &extent); + error = xwimp_set_extent(ta->window, &extent); if (error) { LOG(("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess)); - free(ret->font_family); - free(ret->text); - free(ret); - return 0; + return false; } /* and open the window */ - error = xwimp_open_window_nested((wimp_open *)&state, parent, + error = xwimp_open_window_nested((wimp_open *)&state, ta->parent, wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_XORIGIN_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT @@ -252,27 +277,12 @@ uintptr_t textarea_create(wimp_w parent, wimp_i icon, unsigned int flags, if (error) { LOG(("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess)); - free(ret->font_family); - free(ret->text); - free(ret); - return 0; + return false; } - /* make available for immediate use */ - textarea_reflow(ret, 0); - - /* and register our event handlers */ - ro_gui_wimp_event_set_user_data(ret->window, ret); - ro_gui_wimp_event_register_mouse_click(ret->window, - textarea_mouse_click); - ro_gui_wimp_event_register_keypress(ret->window, - textarea_key_press); - ro_gui_wimp_event_register_redraw_window(ret->window, - textarea_redraw); - ro_gui_wimp_event_register_open_window(ret->window, - textarea_open); - - return (uintptr_t)ret; + /* reflow the text */ + textarea_reflow(ta, 0); + return true; } /** diff --git a/riscos/textarea.h b/riscos/textarea.h index a40bfb9ad..5a9a5f2d6 100644 --- a/riscos/textarea.h +++ b/riscos/textarea.h @@ -11,7 +11,10 @@ #ifndef _NETSURF_RISCOS_TEXTAREA_H_ #define _NETSURF_RISCOS_TEXTAREA_H_ +#include +#include #include "rufl.h" +#include "oslib/wimp.h" /* Text area flags */ #define TEXTAREA_MULTILINE 0x01 /**< Text area is multiline */ @@ -20,6 +23,7 @@ uintptr_t textarea_create(wimp_w parent, wimp_i icon, unsigned int flags, const char *font_family, unsigned int font_size, rufl_style font_style); +bool textarea_update(uintptr_t self); void textarea_destroy(uintptr_t self); bool textarea_set_text(uintptr_t self, const char *text); int textarea_get_text(uintptr_t self, char *buf, unsigned int len); -- cgit v1.2.3