netsurf/riscos/theme.c

152 lines
4.2 KiB
C

/*
* This file is part of NetSurf, http://netsurf.sourceforge.net/
* Licensed under the GNU General Public License,
* http://www.opensource.org/licenses/gpl-license
* Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
* Copyright 2003 James Bursa <bursa@users.sourceforge.net>
*/
/** \file
* Toolbar themes (implementation).
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "oslib/osfile.h"
#include "oslib/osspriteop.h"
#include "oslib/wimp.h"
#include "netsurf/riscos/gui.h"
#include "netsurf/riscos/theme.h"
#include "netsurf/utils/utils.h"
static wimp_window *theme_toolbar_template = 0;
static osspriteop_area *theme_sprite_area = 0;
unsigned int theme_throbs;
/**
* Load a theme from a directory.
*
* The directory must contain a Templates file containing the toolbar template,
* and a Sprites file containing icons.
*/
void ro_theme_load(char *pathname)
{
char name[] = "toolbar";
int context, window_size, data_size, size, i;
static char *data = 0;
char filename[strlen(pathname) + 12];
fileswitch_object_type obj_type;
/* free old theme data */
free(theme_toolbar_template);
free(data);
free(theme_sprite_area);
/* load template */
sprintf(filename, "%s.Templates", pathname);
wimp_open_template(filename);
/* find required buffer sizes */
context = wimp_load_template(wimp_GET_SIZE, 0, 0, wimp_NO_FONTS,
name, 0, &window_size, &data_size);
assert(context != 0);
theme_toolbar_template = xcalloc((unsigned int) window_size, 1);
data = xcalloc((unsigned int) data_size, 1);
/* load */
wimp_load_template(theme_toolbar_template, data, data + data_size,
wimp_NO_FONTS, name, 0, 0, 0);
wimp_close_template();
assert(ICON_TOOLBAR_RELOAD < theme_toolbar_template->icon_count);
theme_toolbar_template->flags |= wimp_WINDOW_FURNITURE_WINDOW;
theme_toolbar_template->icons[ICON_TOOLBAR_URL].data.indirected_text.size = 256;
theme_toolbar_template->icons[ICON_TOOLBAR_STATUS].data.indirected_text.size = 256;
/* load sprites */
sprintf(filename, "%s.Sprites", pathname);
obj_type = osfile_read_no_path(filename, 0, 0, &size, 0);
assert(obj_type & fileswitch_IS_FILE);
theme_sprite_area = xcalloc((unsigned int)(size + 16), 1);
theme_sprite_area->size = size + 16;
theme_sprite_area->sprite_count = 0;
theme_sprite_area->first = 16;
theme_sprite_area->used = 16;
osspriteop_clear_sprites(osspriteop_USER_AREA, theme_sprite_area);
osspriteop_load_sprite_file(osspriteop_USER_AREA, theme_sprite_area,
filename);
theme_toolbar_template->sprite_area = theme_sprite_area;
theme_toolbar_template->icons[ICON_TOOLBAR_THROBBER].data.indirected_sprite.area =
theme_sprite_area;
/* find the highest sprite called throbber%i */
theme_throbs = 0;
for (i = 1; i <= theme_sprite_area->sprite_count; i++) {
char name[32];
osspriteop_return_name(osspriteop_USER_AREA,
theme_sprite_area, name, 32, i);
if (strncmp(name, "throbber", 8) == 0) {
unsigned int n = atoi(name + 8);
if (theme_throbs < n)
theme_throbs = n;
}
}
}
/**
* Create a toolbar from the current theme.
*
* The buffers url_buffer and status_buffer must be at least 256 bytes each,
* throbber_buffer at least 12 bytes;
*/
wimp_w ro_theme_create_toolbar(char *url_buffer, char *status_buffer,
char *throbber_buffer)
{
wimp_w w;
theme_toolbar_template->icons[ICON_TOOLBAR_URL].data.indirected_text.text = url_buffer;
theme_toolbar_template->icons[ICON_TOOLBAR_STATUS].data.indirected_text.text = status_buffer;
theme_toolbar_template->icons[ICON_TOOLBAR_THROBBER].data.indirected_sprite.id =
(osspriteop_id) throbber_buffer;
w = wimp_create_window(theme_toolbar_template);
return w;
}
/**
* Return the height of the current toolbar.
*/
int ro_theme_toolbar_height(void)
{
return abs(theme_toolbar_template->extent.y1 - theme_toolbar_template->extent.y0);
}
/**
* Resize the URL icon in a toolbar.
*/
void ro_theme_resize_toolbar(wimp_w w, int width, int height)
{
wimp_icon_state ic;
ic.w = w;
ic.i = ICON_TOOLBAR_URL;
wimp_get_icon_state(&ic);
wimp_resize_icon(w, ICON_TOOLBAR_URL, ic.icon.extent.x0, ic.icon.extent.y0,
width - 8, ic.icon.extent.y1);
wimp_force_redraw(w, ic.icon.extent.x0, ic.icon.extent.y0,
width, ic.icon.extent.y1);
}