void ro_gui_create_menu(wimp_menu *menu, int x, int y) { os_error *error; current_menu = menu; int colour; if (menu == colour_menu) { colour = ro_gui_get_icon_background_colour(dialog_main, menu_icon - 1); for (int i = 0; i < 16; i++) { if (i == colour) { colour_menu->entries[i].menu_flags |= wimp_MENU_TICKED; } else { colour_menu->entries[i].menu_flags &= ~wimp_MENU_TICKED; } } } else if (menu == main_menu) { if (theme_sprites) { main_menu->entries[1].icon_flags &= ~wimp_ICON_SHADED; } else { main_menu->entries[1].icon_flags |= wimp_ICON_SHADED; } } error = xwimp_create_menu(menu, x - 64, y); if (error) { LOG(("xwimp_create_menu: 0x%x: %s", error->errnum, error->errmess)); warn_user("MenuError", error->errmess); } }
bool ro_gui_save_theme(char *path) { os_error *error; struct theme_file_header *file_header; char *workspace; int workspace_size, output_size, input_left, output_left; squash_output_status status; /* Get some memory */ unsigned int file_size = sizeof (struct theme_file_header); file_header = (struct theme_file_header *)calloc(file_size, 1); if (!file_header) { LOG(("No memory for calloc()")); warn_user("NoMemory", 0); return false; } /* Complete the header */ file_header->magic_value = 0x4d54534e; file_header->parser_version = 2; strcpy(file_header->name, ro_gui_get_icon_string(dialog_main, ICON_MAIN_NAME)); strcpy(file_header->author, ro_gui_get_icon_string(dialog_main, ICON_MAIN_AUTHOR)); file_header->browser_bg = ro_gui_get_icon_background_colour(dialog_main, ICON_MAIN_BROWSER_COLOUR); file_header->hotlist_bg = ro_gui_get_icon_background_colour(dialog_main, ICON_MAIN_HOTLIST_COLOUR); file_header->status_bg = ro_gui_get_icon_background_colour(dialog_main, ICON_MAIN_STATUSBG_COLOUR); file_header->status_fg = ro_gui_get_icon_background_colour(dialog_main, ICON_MAIN_STATUSFG_COLOUR); if (ro_gui_get_icon_selected_state(dialog_main, ICON_MAIN_THROBBER_LEFT)) file_header->theme_flags = (1 << 0); if (ro_gui_get_icon_selected_state(dialog_main, ICON_MAIN_THROBBER_REDRAW)) file_header->theme_flags = (1 << 1); /* Append the compressed sprites */ if (theme_sprites) { file_header->decompressed_sprite_size = theme_sprites->size; error = xsquash_compress_return_sizes(theme_sprites->size, &workspace_size, &output_size); if (error) { free(file_header); LOG(("xsquash_compress_return_sizes: 0x%x: %s", error->errnum, error->errmess)); warn_user("MiscError", error->errmess); return false; } workspace = realloc(file_header, file_size + output_size); if (!workspace) { free(file_header); LOG(("No memory for realloc()")); warn_user("NoMemory", 0); return false; } file_header = (struct theme_file_header *)workspace; workspace = malloc(workspace_size); if (!workspace) { free(file_header); LOG(("No memory for malloc()")); warn_user("NoMemory", 0); return false; } error = xsquash_compress((squash_input_status)0, workspace, (byte *)theme_sprites, theme_sprites->size, (byte *)(file_header + 1), output_size, &status, 0, &input_left, 0, &output_left); free(workspace); if (error) { free(file_header); LOG(("xsquash_compress: 0x%x: %s", error->errnum, error->errmess)); warn_user("MiscError", error->errmess); return false; } if ((input_left > 0) || (status != 0)) { free(file_header); LOG(("Failed to complete compression with %i bytes left and status %i", input_left, (int)status)); warn_user("FileError", 0); return false; } file_header->compressed_sprite_size = output_size - output_left; file_size += output_size - output_left; } /* Save the file */ error = xosfile_save_stamped(path, (bits)0xffd, (char *)file_header, ((char *)file_header) + file_size); free(file_header); if (error) { LOG(("xosfile_save_stamped: 0x%x: %s", error->errnum, error->errmess)); warn_user("FileError", error->errmess); return false; } return false; }