summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2006-10-20 00:47:07 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2006-10-20 00:47:07 +0000
commit1e6345e562e2701d036dd953befd03273ea46b05 (patch)
tree08f62792e06e89af2f1623340477b1ede0d90668 /riscos
parent118d282ce71912a800981d3d9dbe5c1314e4f0b0 (diff)
downloadnetsurf-1e6345e562e2701d036dd953befd03273ea46b05.tar.gz
netsurf-1e6345e562e2701d036dd953befd03273ea46b05.tar.bz2
Allow textareas to reformat on icon change.
svn path=/trunk/netsurf/; revision=3012
Diffstat (limited to 'riscos')
-rw-r--r--riscos/textarea.c108
-rw-r--r--riscos/textarea.h4
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 <stdbool.h>
+#include <stdint.h>
#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);