bool ro_gui_options_theme_initialise(wimp_w w) { wimp_window_state state; wimp_icon_state icon_state; os_error *error; struct theme_descriptor *theme_choice; struct toolbar_display *toolbar; /* only allow one instance for now*/ if (theme_pane) return false; error = xwimp_create_window(&theme_pane_definition, &theme_pane); if (error) { LOG(("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess)); return false; } state.w = w; error = xwimp_get_window_state(&state); if (error) { LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); return false; } icon_state.w = w; icon_state.i = THEME_PANE_AREA; error = xwimp_get_icon_state(&icon_state); if (error) { LOG(("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess)); return false; } state.w = theme_pane; state.visible.x1 = state.visible.x0 + icon_state.icon.extent.x1 - 16 - ro_get_vscroll_width(theme_pane); state.visible.x0 += icon_state.icon.extent.x0 + 16; state.visible.y0 = state.visible.y1 + icon_state.icon.extent.y0 + 16; state.visible.y1 += icon_state.icon.extent.y1 - 28; LOG(("Y0 = %i, y1 = %i", icon_state.icon.extent.y0, icon_state.icon.extent.y1)); error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state), w, wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_XORIGIN_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_YORIGIN_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_LS_EDGE_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_BS_EDGE_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_RS_EDGE_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_TS_EDGE_SHIFT); if (error) { LOG(("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess)); return false; } /* load themes */ ro_gui_options_theme_load(); /* set the current selection */ theme_choice = ro_gui_theme_find(option_theme); if (!theme_choice) theme_choice = ro_gui_theme_find("Aletheia"); for (toolbar = toolbars; toolbar; toolbar = toolbar->next) ro_gui_set_icon_selected_state(theme_pane, toolbar->icon_number, (toolbar->descriptor == theme_choice)); ro_gui_wimp_event_memorise(theme_pane); ro_gui_wimp_event_set_help_prefix(theme_pane, "HelpThemePConfig"); ro_gui_wimp_event_register_mouse_click(w, ro_gui_options_theme_click); ro_gui_wimp_event_register_cancel(w, THEME_CANCEL_BUTTON); ro_gui_wimp_event_register_ok(w, THEME_OK_BUTTON, ro_gui_options_theme_ok); ro_gui_wimp_event_set_help_prefix(w, "HelpThemeConfig"); ro_gui_wimp_event_memorise(w); return true; }
void ro_gui_url_complete_resize(struct toolbar *toolbar, wimp_open *open) { os_box extent = { 0, 0, 0, 0 }; os_box url_extent; wimp_window_state toolbar_state; wimp_window_state state; os_error *error; int lines; int scroll_v = 0; /* only react to our window */ if (open->w != url_complete_parent) return; /* if there is no toolbar, or there is no URL bar shown, * or there are no URL matches, close it */ if (!ro_toolbar_get_display_url(toolbar) || (!url_complete_matches) || (url_complete_matches_available == 0)) { ro_gui_url_complete_close(); return; } /* get our current auto-complete window state for the scroll values */ state.w = dialog_url_complete; error = xwimp_get_window_state(&state); if (error) { LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); return; } if (url_complete_matches_reset) state.yscroll = 0; /* move the window to the correct position */ toolbar_state.w = ro_toolbar_get_window(toolbar); error = xwimp_get_window_state(&toolbar_state); if (error) { LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); return; } if (!ro_toolbar_get_url_field_extent(toolbar, &url_extent)) { LOG("Failed to read URL field extent."); return; } lines = url_complete_matches_available; extent.y0 = -(lines * 44); extent.x1 = 65536; error = xwimp_set_extent(dialog_url_complete, &extent); if (error) { LOG("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); return; } state.next = open->next; state.flags &= ~wimp_WINDOW_VSCROLL; state.flags &= ~(4095 << 16); /* clear bits 16-27 */ if (lines > MAXIMUM_VISIBLE_LINES) { lines = MAXIMUM_VISIBLE_LINES; scroll_v = ro_get_vscroll_width(NULL) - 2; state.flags |= wimp_WINDOW_VSCROLL; } state.visible.x0 = open->visible.x0 + 2 + url_extent.x0; state.visible.x1 = open->visible.x0 - 2 + url_extent.x1 - scroll_v; state.visible.y1 = open->visible.y1 - url_extent.y1 + 2; state.visible.y0 = state.visible.y1 - (lines * 44); if (state.visible.x1 + scroll_v > toolbar_state.visible.x1) state.visible.x1 = toolbar_state.visible.x1 - scroll_v; if (state.visible.x1 - state.visible.x0 < 0) { error = xwimp_close_window(dialog_url_complete); if (error) { LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); } } else { error = xwimp_open_window_nested_with_flags(&state, (wimp_w)-1, 0); if (error) { LOG("xwimp_open_window: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("WimpError", error->errmess); return; } open->next = dialog_url_complete; } }
/** * Reflow a text area from the given line onwards * * \param ta Text area to reflow * \param line Line number to begin reflow on */ void ro_textarea_reflow(struct text_area *ta, unsigned int line) { rufl_code code; char *text; unsigned int len; size_t b_off; int x; char *space; unsigned int line_count = 0; os_box extent; os_error *error; /** \todo pay attention to line parameter */ /** \todo create horizontal scrollbar if needed */ ta->line_count = 0; if (!ta->lines) { ta->lines = malloc(LINE_CHUNK_SIZE * sizeof(struct line_info)); if (!ta->lines) { LOG(("malloc failed")); return; } } if (!(ta->flags & TEXTAREA_MULTILINE)) { /* Single line */ ta->lines[line_count].b_start = 0; ta->lines[line_count++].b_length = ta->text_len - 1; ta->line_count = line_count; return; } for (len = ta->text_len - 1, text = ta->text; len > 0; len -= b_off, text += b_off) { code = rufl_split(ta->font_family, ta->font_style, ta->font_size, text, len, ta->vis_width - MARGIN_LEFT - MARGIN_RIGHT, &b_off, &x); if (code != rufl_OK) { if (code == rufl_FONT_MANAGER_ERROR) LOG(("rufl_x_to_offset: 0x%x: %s", rufl_fm_error->errnum, rufl_fm_error->errmess)); else LOG(("rufl_x_to_offset: 0x%x", code)); return; } if (line_count > 0 && line_count % LINE_CHUNK_SIZE == 0) { struct line_info *temp = realloc(ta->lines, (line_count + LINE_CHUNK_SIZE) * sizeof(struct line_info)); if (!temp) { LOG(("realloc failed")); return; } ta->lines = temp; } /* handle CR/LF */ for (space = text; space < text + b_off; space++) { if (*space == '\r' || *space == '\n') break; } if (space != text + b_off) { /* Found newline; use it */ ta->lines[line_count].b_start = text - ta->text; ta->lines[line_count++].b_length = space - text; /* CRLF / LFCR pair */ if (*space == '\r' && *(space + 1) == '\n') space++; else if (*space == '\n' && *(space + 1) == '\r') space++; b_off = space + 1 - text; if (len - b_off == 0) { /* reached end of input => add last line */ ta->lines[line_count].b_start = text + b_off - ta->text; ta->lines[line_count++].b_length = 0; } continue; } if (len - b_off > 0) { /* find last space (if any) */ for (space = text + b_off; space > text; space--) if (*space == ' ') break; if (space != text) b_off = space + 1 - text; } ta->lines[line_count].b_start = text - ta->text; ta->lines[line_count++].b_length = b_off; } ta->line_count = line_count; /* and now update extent */ extent.x0 = 0; extent.y1 = 0; extent.x1 = ta->vis_width; extent.y0 = -ta->line_height * line_count - ta->line_spacing; if (extent.y0 > (int)-ta->vis_height) /* haven't filled window yet */ return; error = xwimp_set_extent(ta->window, &extent); if (error) { LOG(("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess)); return; } /* Create vertical scrollbar if we don't already have one */ if (!ro_gui_wimp_check_window_furniture(ta->window, wimp_WINDOW_VSCROLL)) { wimp_window_state state; wimp_w parent; bits linkage; unsigned int vscroll_width; /* Save window parent & linkage flags */ state.w = ta->window; error = xwimp_get_window_state_and_nesting(&state, &parent, &linkage); if (error) { LOG(("xwimp_get_window_state_and_nesting: 0x%x: %s", error->errnum, error->errmess)); return; } /* Now, attempt to create vertical scrollbar */ ro_gui_wimp_update_window_furniture(ta->window, wimp_WINDOW_VSCROLL, wimp_WINDOW_VSCROLL); /* Get new window state */ state.w = ta->window; error = xwimp_get_window_state(&state); if (error) { LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); return; } /* Get scroll width */ vscroll_width = ro_get_vscroll_width(NULL); /* Shrink width by difference */ state.visible.x1 -= vscroll_width; /* and reopen window */ error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state), parent, linkage); if (error) { LOG(("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess)); return; } /* finally, update visible width */ ta->vis_width -= vscroll_width; /* Now we've done that, we have to reflow the text area */ ro_textarea_reflow(ta, 0); } }
void gui_cert_verify(const char *url, const struct ssl_cert_info *certs, unsigned long num, nserror (*cb)(bool proceed, void *pw), void *cbpw) { struct ro_sslcert *sslcert_window; wimp_window_state state; wimp_icon_state istate; wimp_window_info info; os_error *error; bool set_extent; assert(certs); sslcert_window = malloc(sizeof(struct ro_sslcert)); if (sslcert_window == NULL) { LOG(("Failed to allocate memory for SSL Cert Dialog")); return; } /* Create the SSL window and its pane. */ error = xwimp_create_window(ro_gui_cert_dialog_template, &(sslcert_window->window)); if (error) { LOG(("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess)); free(sslcert_window); return; } error = xwimp_create_window(ro_gui_cert_tree_template, &(sslcert_window->pane)); if (error) { LOG(("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess)); free(sslcert_window); return; } /* Create the SSL data and build a tree from it. */ sslcert_window->tv = ro_treeview_create(sslcert_window->pane, NULL, NULL, sslcert_get_tree_flags()); if (sslcert_window->tv == NULL) { LOG(("Failed to allocate treeview")); free(sslcert_window); return; } sslcert_window->data = sslcert_create_session_data(num, url, cb, cbpw); sslcert_load_tree(ro_treeview_get_tree(sslcert_window->tv), certs, sslcert_window->data); tree_set_redraw(ro_treeview_get_tree(sslcert_window->tv), true); /* Set up the certificate window event handling. * * (The action buttons are registered as button events, not OK and * Cancel, as both need to carry out actions.) */ ro_gui_wimp_event_set_user_data(sslcert_window->window, sslcert_window); ro_gui_wimp_event_register_close_window(sslcert_window->window, ro_gui_cert_close_window); ro_gui_wimp_event_register_button(sslcert_window->window, ICON_SSL_REJECT, ro_gui_cert_reject); ro_gui_wimp_event_register_button(sslcert_window->window, ICON_SSL_ACCEPT, ro_gui_cert_accept); ro_gui_dialog_open_persistent(NULL, sslcert_window->window, false); /* Nest the tree window inside the pane window. To do this, we: * - Get the current pane extent, * - Get the parent window position and the location of the pane- * locating icon inside it, * - Set the visible area of the pane to suit, * - Check that the pane extents are OK for this visible area, and * increase them if necessary, * - Before finally opening the pane as a nested part of the parent. */ info.w = sslcert_window->pane; error = xwimp_get_window_info_header_only(&info); if (error) { ro_gui_cert_release_window(sslcert_window); LOG(("xwimp_get_window_info: 0x%x: %s", error->errnum, error->errmess)); return; } state.w = sslcert_window->window; error = xwimp_get_window_state(&state); if (error) { ro_gui_cert_release_window(sslcert_window); LOG(("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess)); return; } istate.w = sslcert_window->window; istate.i = ICON_SSL_PANE; error = xwimp_get_icon_state(&istate); if (error) { ro_gui_cert_release_window(sslcert_window); LOG(("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess)); return; } state.w = sslcert_window->pane; state.visible.x1 = state.visible.x0 + istate.icon.extent.x1 - 20 - ro_get_vscroll_width(sslcert_window->pane); state.visible.x0 += istate.icon.extent.x0 + 20; state.visible.y0 = state.visible.y1 + istate.icon.extent.y0 + 20 + ro_get_hscroll_height(sslcert_window->pane); state.visible.y1 += istate.icon.extent.y1 - 32; set_extent = false; if ((info.extent.x1 - info.extent.x0) < (state.visible.x1 - state.visible.x0)) { info.extent.x0 = 0; info.extent.x1 = state.visible.x1 - state.visible.x0; set_extent = true; } if ((info.extent.y1 - info.extent.y0) < (state.visible.y1 - state.visible.y0)) { info.extent.y1 = 0; info.extent.x1 = state.visible.y0 - state.visible.y1; set_extent = true; } if (set_extent) { error = xwimp_set_extent(sslcert_window->pane, &(info.extent)); if (error) { ro_gui_cert_release_window(sslcert_window); LOG(("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess)); return; } } error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state), sslcert_window->window, wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_XORIGIN_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_YORIGIN_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_LS_EDGE_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_RS_EDGE_SHIFT); if (error) { ro_gui_cert_release_window(sslcert_window); LOG(("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess)); ro_gui_cert_release_window(sslcert_window); return; } ro_treeview_set_origin(sslcert_window->tv, 0, 0); }
/** * Update the a text area following a change in the parent icon * * \param self Text area to update */ bool ro_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)); return false; } 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)); return false; } state.w = ta->window; state.visible.x1 = state.visible.x0 + istate.icon.extent.x1 - 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(ta->window) - state.yscroll; state.visible.y1 += istate.icon.extent.y1 - 2 - state.yscroll; if (ta->flags & TEXTAREA_READONLY) { state.visible.x0 += 2; state.visible.x1 -= 4; state.visible.y0 += 2; state.visible.y1 -= 4; } /* set our width/height */ 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 = -ta->vis_height; extent.x1 = ta->vis_width; extent.y1 = 0; error = xwimp_set_extent(ta->window, &extent); if (error) { LOG(("xwimp_set_extent: 0x%x: %s", error->errnum, error->errmess)); return false; } /* and open the window */ error = xwimp_open_window_nested(PTR_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 << wimp_CHILD_YORIGIN_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_LS_EDGE_SHIFT | wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT << wimp_CHILD_RS_EDGE_SHIFT); if (error) { LOG(("xwimp_open_window_nested: 0x%x: %s", error->errnum, error->errmess)); return false; } /* reflow the text */ ro_textarea_reflow(ta, 0); return true; }