Example #1
0
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;
}
Example #2
0
/**
 * 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);
}