bool ro_gui_url_bar_set_content_favicon(struct url_bar *url_bar, struct hlcache_handle *h) { int type = 0; char sprite[URLBAR_FAVICON_NAME_LENGTH]; if (url_bar == NULL) return false; if (h != NULL) type = ro_content_filetype(h); if (type != 0) { snprintf(sprite, URLBAR_FAVICON_NAME_LENGTH, "small_%.3x", type); if (!ro_gui_wimp_sprite_exists(sprite)) type = 0; } url_bar->favicon_type = type; if (url_bar->favicon_content == NULL) { if (type == 0) snprintf(url_bar->favicon_sprite, URLBAR_FAVICON_NAME_LENGTH, "Ssmall_xxx"); else snprintf(url_bar->favicon_sprite, URLBAR_FAVICON_NAME_LENGTH, "S%s", sprite); if (!url_bar->hidden) xwimp_force_redraw(url_bar->window, url_bar->favicon_extent.x0, url_bar->favicon_extent.y0, url_bar->favicon_extent.x1, url_bar->favicon_extent.y1); } return true; }
/** * Suggest a leafname and sprite name for the given content. * * \param h content being saved * \param save_type type of save operation being performed * \param url used to determine leafname * \param leaf_buf buffer to receive suggested leafname. * \param leaf_len size of buffer to receive suggested leafname. * \param icon_buf buffer to receive sprite name. * \param icon_len size of buffer to receive icon name. */ static void ro_gui_save_set_state(struct hlcache_handle *h, gui_save_type save_type, const nsurl *url, char *leaf_buf, size_t leaf_len, char *icon_buf, size_t icon_len) { /* filename */ const char *name = gui_save_table[save_type].name; bool done = false; char *nice = NULL; nserror err; char *local_name; assert(icon_len >= 13); /* parameters that we need to remember */ gui_save_current_type = save_type; gui_save_content = h; /* suggest a filetype based upon the content */ gui_save_filetype = gui_save_table[save_type].filetype; if (!gui_save_filetype && h) { if (save_type == GUI_SAVE_OBJECT_NATIVE) { switch (ro_content_native_type(h)) { case osfile_TYPE_SPRITE: gui_save_filetype = osfile_TYPE_SPRITE; break; case osfile_TYPE_DRAW: gui_save_filetype = osfile_TYPE_DRAW; break; default: break; } } if (!gui_save_filetype) gui_save_filetype = ro_content_filetype(h); } /* leafname */ if ((url != NULL) && (nsurl_nice(url, &nice, nsoption_bool(strip_extensions)) == NSERROR_OK)) { size_t i; for (i = 0; nice[i]; i++) { if (nice[i] == '.') nice[i] = '/'; else if (nice[i] <= ' ' || strchr(":*#$&@^%\\", nice[i])) nice[i] = '_'; } name = nice; } else { name = messages_get(name); } /* filename is utf8 */ if (save_type == GUI_SAVE_COMPLETE && leaf_len > 0) { leaf_buf[0] = '!'; leaf_buf++; leaf_len--; } strncpy(leaf_buf, name, leaf_len); leaf_buf[leaf_len - 1] = 0; err = utf8_to_local_encoding(name, 0, &local_name); if (err != NSERROR_OK) { /* badenc should never happen */ assert(err != NSERROR_BAD_ENCODING); local_name = NULL; } if (local_name != NULL) name = local_name; /* sprite name used for icon and dragging */ if (save_type == GUI_SAVE_COMPLETE) { int index; /* Paint gets confused with uppercase characters and we need to convert spaces to hard spaces */ icon_buf[0] = '!'; for (index = 0; index < 11 && name[index]; ) { char ch = name[index]; if (ch == ' ') icon_buf[++index] = 0xa0; else icon_buf[++index] = tolower(ch); } memset(&icon_buf[index + 1], 0, 11 - index); icon_buf[12] = '\0'; if (ro_gui_save_create_thumbnail(h, icon_buf)) done = true; } if (!done) { osspriteop_header *sprite; os_error *error; sprintf(icon_buf, "file_%.3x", gui_save_filetype); error = ro_gui_wimp_get_sprite(icon_buf, &sprite); if (error && error->errnum == error_SPRITE_OP_DOESNT_EXIST) { /* try the 'unknown' filetype sprite as a fallback */ memcpy(icon_buf, "file_xxx", 9); error = ro_gui_wimp_get_sprite(icon_buf, &sprite); } if (error) { LOG("ro_gui_wimp_get_sprite: 0x%x: %s", error->errnum, error->errmess); ro_warn_user("MiscError", error->errmess); } else { /* the sprite area should always be large enough for * file_xxx sprites */ assert(sprite->size <= saveas_area->size - saveas_area->first); memcpy((byte*)saveas_area + saveas_area->first, sprite, sprite->size); saveas_area->sprite_count = 1; saveas_area->used = saveas_area->first + sprite->size; } } free(local_name); free(nice); }