From 8733cf9836396604bdbd679cdf291adf1ef3bda0 Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Tue, 3 Jan 2006 01:37:25 +0000 Subject: [project @ 2006-01-03 01:37:25 by rjw] Move the caret from writable icons when shading. svn path=/import/netsurf/; revision=1972 --- riscos/wimp.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- riscos/wimp.h | 2 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/riscos/wimp.c b/riscos/wimp.c index 6307844de..2539321ba 100644 --- a/riscos/wimp.c +++ b/riscos/wimp.c @@ -388,11 +388,15 @@ bool ro_gui_get_icon_selected_state(wimp_w w, wimp_i i) { * * \param w window handle * \param i icon handle - * \param state selected state + * \param state shaded state */ void ro_gui_set_icon_shaded_state(wimp_w w, wimp_i i, bool state) { + wimp_caret caret; os_error *error; - if (ro_gui_get_icon_shaded_state(w, i) == state) return; + + /* update the state */ + if (ro_gui_get_icon_shaded_state(w, i) == state) + return; error = xwimp_set_icon_state(w, i, (state ? wimp_ICON_SHADED : 0), wimp_ICON_SHADED); if (error) { @@ -400,6 +404,30 @@ void ro_gui_set_icon_shaded_state(wimp_w w, wimp_i i, bool state) { error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } + if (!state) + return; + + /* ensure the caret is not in a shaded icon */ + error = xwimp_get_caret_position(&caret); + if (error) { + LOG(("xwimp_get_caret_position: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } + if ((caret.w != w) || (caret.i != i)) + return; + /* move the caret to the first avaiable writable */ + if (ro_gui_set_caret_first(w)) + return; + /* lose the caret */ + error = xwimp_set_caret_position((wimp_w)-1, (wimp_i)-1, -1, -1, -1, -1); + if (error) { + LOG(("xwimp_set_caret_position: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } } @@ -533,8 +561,11 @@ void ro_gui_set_window_title(wimp_w w, const char *text) { /** * Places the caret in the first available icon + * + * \w the window to place the caret in + * \return true if the caret was placed, false otherwise */ -void ro_gui_set_caret_first(wimp_w w) { +bool ro_gui_set_caret_first(wimp_w w) { int icon, b; wimp_window_state win_state; wimp_window_info_base window; @@ -548,10 +579,10 @@ void ro_gui_set_caret_first(wimp_w w) { LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); - return; + return false; } if (!(win_state.flags & wimp_WINDOW_OPEN)) - return; + return false; /* get the window details for the icon count */ window.w = w; @@ -560,7 +591,7 @@ void ro_gui_set_caret_first(wimp_w w) { LOG(("xwimp_get_window_info: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); - return; + return false; } /* work through all the icons */ @@ -572,7 +603,7 @@ void ro_gui_set_caret_first(wimp_w w) { LOG(("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); - return; + return false; } /* ignore if it's shaded or not writable */ @@ -591,8 +622,9 @@ void ro_gui_set_caret_first(wimp_w w) { error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } - return; + return true; } + return false; } diff --git a/riscos/wimp.h b/riscos/wimp.h index 04a97d9de..a7777d28d 100644 --- a/riscos/wimp.h +++ b/riscos/wimp.h @@ -44,7 +44,7 @@ void ro_gui_set_icon_button_type(wimp_w w, wimp_i i, int type); void ro_gui_set_icon_sprite(wimp_w w, wimp_i i, osspriteop_area *area, const char *name); void ro_gui_set_window_title(wimp_w w, const char *title); -void ro_gui_set_caret_first(wimp_w w); +bool ro_gui_set_caret_first(wimp_w w); void ro_gui_open_window_centre(wimp_w parent, wimp_w child); osspriteop_area *ro_gui_load_sprite_file(const char *pathname); -- cgit v1.2.3