void ro_treeview_redraw(wimp_draw *redraw) { osbool more; os_error *error; ro_treeview *tv; tv = (ro_treeview *) ro_gui_wimp_event_get_user_data(redraw->w); if (tv == NULL) { LOG(("NULL treeview block for window: 0x%x", (unsigned int) redraw->w)); /* Don't return, as not servicing redraw events isn't a good * idea. The following code must handle (tv == NULL) * gracefully while clearing the redraw queue. */ } error = xwimp_redraw_window(redraw, &more); if (error) { LOG(("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } ro_treeview_redraw_loop(redraw, tv, more); }
void ro_gui_history_redraw(wimp_draw *redraw) { osbool more; os_error *error; struct redraw_context ctx = { .interactive = true, .background_images = true, .plot = &ro_plotters }; error = xwimp_redraw_window(redraw, &more); if (error) { LOG(("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } while (more) { ro_plot_origin_x = redraw->box.x0 - redraw->xscroll; ro_plot_origin_y = redraw->box.y1 - redraw->yscroll; history_redraw(history_current, &ctx); error = xwimp_get_rectangle(redraw, &more); if (error) { LOG(("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } } } /** * Handle Pointer Entering Window events the history window. * * \param *entering The Wimp_PointerEnteringWindow block. */ void ro_gui_history_pointer_entering(wimp_entering *entering) { ro_mouse_track_start(ro_gui_history_track_end, ro_gui_history_mouse_at, NULL); }
void ro_gui_debugwin_redraw(wimp_draw *redraw) { osbool more; os_error *error; /* Select RISC OS plotters */ plot = ro_plotters; ro_plot_set_scale(1.0); error = xwimp_redraw_window(redraw, &more); if (error) { LOG(("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } while (more) { int clip_x0, clip_y0, clip_x1, clip_y1; /* Sep plot origin */ ro_plot_origin_x = redraw->box.x0 - redraw->xscroll; ro_plot_origin_y = redraw->box.y1 - redraw->yscroll; /* Set clip rectangle */ clip_x0 = (redraw->clip.x0 - ro_plot_origin_x) / 2; /* left */ clip_y0 = (ro_plot_origin_y - redraw->clip.y1) / 2; /* top */ clip_x1 = (redraw->clip.x1 - ro_plot_origin_x) / 2; /* right */ clip_y1 = (ro_plot_origin_y - redraw->clip.y0) / 2; /* bottom */ plot.clip(clip_x0, clip_y0, clip_x1, clip_y1); /* Render the content debug table */ debugwin_redraw(clip_x0, clip_y0, clip_x1, clip_y1); error = xwimp_get_rectangle(redraw, &more); if (error) { LOG(("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } } }
/** * Internal textarea redraw routine * * \param redraw Redraw/update request block * \param update True if update, false if full redraw */ void ro_textarea_redraw_internal(wimp_draw *redraw, bool update) { struct text_area *ta; int clip_x0, clip_y0, clip_x1, clip_y1; int line0, line1, line; osbool more; rufl_code code; os_error *error; ta = (struct text_area *)ro_gui_wimp_event_get_user_data(redraw->w); if (update) error = xwimp_update_window(redraw, &more); else error = xwimp_redraw_window(redraw, &more); if (error) { LOG(("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess)); return; } while (more) { clip_x0 = redraw->clip.x0 - (redraw->box.x0-redraw->xscroll); clip_y0 = (redraw->box.y1-redraw->yscroll) - redraw->clip.y1; clip_x1 = redraw->clip.x1 - (redraw->box.x0-redraw->xscroll); clip_y1 = (redraw->box.y1-redraw->yscroll) - redraw->clip.y0; error = xcolourtrans_set_gcol( (ta->flags & TEXTAREA_READONLY) ? 0xD9D9D900 : 0xFFFFFF00, colourtrans_SET_BG_GCOL | colourtrans_USE_ECFS_GCOL, os_ACTION_OVERWRITE, 0, 0); if (error) { LOG(("xcolourtrans_set_gcol: 0x%x: %s", error->errnum, error->errmess)); return; } error = xos_clg(); if (error) { LOG(("xos_clg: 0x%x: %s", error->errnum, error->errmess)); return; } if (!ta->lines) /* Nothing to redraw */ return; line0 = clip_y0 / ta->line_height - 1; line1 = clip_y1 / ta->line_height + 1; if (line0 < 0) line0 = 0; if (line1 < 0) line1 = 0; if (ta->line_count - 1 < (unsigned)line0) line0 = ta->line_count - 1; if (ta->line_count - 1 < (unsigned)line1) line1 = ta->line_count - 1; if (line1 < line0) line1 = line0; for (line = line0; line <= line1; line++) { if (ta->lines[line].b_length == 0) continue; error = xcolourtrans_set_font_colours(font_CURRENT, (ta->flags & TEXTAREA_READONLY) ? 0xD9D9D900 : 0xFFFFFF00, 0x00000000, 14, 0, 0, 0); if (error) { LOG(("xcolourtrans_set_font_colours: 0x%x: %s", error->errnum, error->errmess)); return; } code = rufl_paint(ta->font_family, ta->font_style, ta->font_size, ta->text + ta->lines[line].b_start, ta->lines[line].b_length, redraw->box.x0 - redraw->xscroll + MARGIN_LEFT, redraw->box.y1 - redraw->yscroll - ((line + 1) * ta->line_height - ta->line_spacing), rufl_BLEND_FONT); if (code != rufl_OK) { if (code == rufl_FONT_MANAGER_ERROR) LOG(("rufl_paint: rufl_FONT_MANAGER_ERROR: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess)); else LOG(("rufl_paint: 0x%x", code)); } } error = xwimp_get_rectangle(redraw, &more); if (error) { LOG(("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess)); return; } } }
void ro_gui_history_redraw(wimp_draw *redraw) { osbool more; os_error *error; struct redraw_context ctx = { .interactive = true, .background_images = true, .plot = &ro_plotters }; error = xwimp_redraw_window(redraw, &more); if (error) { LOG(("xwimp_redraw_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } while (more) { ro_plot_origin_x = redraw->box.x0 - redraw->xscroll; ro_plot_origin_y = redraw->box.y1 - redraw->yscroll; history_redraw(history_current, &ctx); error = xwimp_get_rectangle(redraw, &more); if (error) { LOG(("xwimp_get_rectangle: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } } } /** * Handle mouse movements over the history window. */ void ro_gui_history_mouse_at(wimp_pointer *pointer) { int x, y; int width; const char *url; wimp_window_state state; wimp_icon_state ic; os_box box = {0, 0, 0, 0}; os_error *error; /* If the mouse hasn't moved, or if we don't want tooltips, exit */ if ((mouse_x == pointer->pos.x && mouse_y == pointer->pos.y) || !nsoption_bool(history_tooltip)) return; /* Update mouse position */ mouse_x = pointer->pos.x; mouse_y = pointer->pos.y; /* Find history tree entry under mouse */ state.w = history_window; error = xwimp_get_window_state(&state); if (error) { LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } x = (pointer->pos.x - (state.visible.x0 - state.xscroll)) / 2; y = -(pointer->pos.y - (state.visible.y1 - state.yscroll)) / 2; url = history_position_url(history_current, x, y); if (!url) { /* not over a tree entry => close tooltip window. */ error = xwimp_close_window(dialog_tooltip); if (error) { LOG(("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } return; } /* get width of string */ error = xwimptextop_string_width(url, strlen(url) > 256 ? 256 : strlen(url), &width); if (error) { LOG(("xwimptextop_string_width: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } ro_gui_set_icon_string(dialog_tooltip, 0, url, true); /* resize icon appropriately */ ic.w = dialog_tooltip; ic.i = 0; error = xwimp_get_icon_state(&ic); if (error) { LOG(("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } error = xwimp_resize_icon(dialog_tooltip, 0, ic.icon.extent.x0, ic.icon.extent.y0, width + 16, ic.icon.extent.y1); if (error) { LOG(("xwimp_resize_icon: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } state.w = dialog_tooltip; error = xwimp_get_window_state(&state); if (error) { LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } /* update window extent */ box.x1 = width + 16; box.y0 = -36; error = xwimp_set_extent(dialog_tooltip, &box); if (error) { LOG(("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } /* set visible area */ state.visible.x0 = pointer->pos.x + 24; state.visible.y0 = pointer->pos.y - 22 - 36; state.visible.x1 = pointer->pos.x + 24 + width + 16; state.visible.y1 = pointer->pos.y - 22; state.next = wimp_TOP; /* open window */ error = xwimp_open_window(PTR_WIMP_OPEN(&state)); if (error) { LOG(("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } }
bool RiscosGui::run() { GNASH_REPORT_FUNCTION; os_t t, now; wimp_block block; wimp_event_no event; osbool more; os_error *error; t = os_read_monotonic_time(); while (!_quit) { error = xwimp_poll_idle(wimp_SAVE_FP, &block, t, NULL, &event); if (error) { log_debug("%s\n", error->errmess); return false; } switch (event) { case wimp_NULL_REASON_CODE: now = os_read_monotonic_time(); if (now > t) { if (_timeout > now) { _quit = true; } else { // TODO: pay attention to interval // if ((os_t)_interval <= (now - t) * 10) { advance_movie(this); // } now = os_read_monotonic_time(); t = now + 10; } } break; case wimp_REDRAW_WINDOW_REQUEST: error = xwimp_redraw_window(&block.redraw, &more); if (error) { log_debug("%s\n", error->errmess); return false; } while (more) { // rect bounds(block.redraw.clip.x0 / 2, block.redraw.clip.y0 / 2, // block.redraw.clip.x1 / 2, block.redraw.clip.y1 / 2); // log_debug("Clip rect: (%d, %d)(%d, %d)\n", // block.redraw.clip.x0 / 2, block.redraw.clip.y0 / 2, // block.redraw.clip.x1 / 2, block.redraw.clip.y1 / 2); // TODO: Make this use the clipping rectangle (convert to TWIPS) rect bounds(-1e10f, -1e10f, 1e10f, 1e10f); #ifdef RENDERER_AGG setInvalidatedRegion(bounds); #endif renderBuffer(); error = xwimp_get_rectangle(&block.redraw, &more); if (error) { log_debug("%s\n", error->errmess); return false; } } break; case wimp_OPEN_WINDOW_REQUEST: error = xwimp_open_window(&block.open); if (error) log_debug("%s\n", error->errmess); break; case wimp_CLOSE_WINDOW_REQUEST: _quit = true; break; case wimp_POINTER_LEAVING_WINDOW: break; case wimp_POINTER_ENTERING_WINDOW: break; case wimp_MOUSE_CLICK: break; case wimp_USER_DRAG_BOX: break; case wimp_MENU_SELECTION: break; case wimp_SCROLL_REQUEST: break; case wimp_LOSE_CARET: break; case wimp_GAIN_CARET: break; case wimp_POLLWORD_NON_ZERO: break; case wimp_USER_MESSAGE: case wimp_USER_MESSAGE_RECORDED: case wimp_USER_MESSAGE_ACKNOWLEDGE: switch (block.message.action) { case message_QUIT: _quit = true; break; default: // user_message(event, &(block.message)); break; } break; } } return true; }