mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-18 17:29:17 +01:00
*Added Update Button to the Settings which can Update to newer Revs (only seen when in UnlockMode)
**Big Thanks to CorneliousJD for Hosting the DOLs)** *Reverted ardi's stuff which made codedumps on the Download (sorry ardi commit it again when its fixed)
This commit is contained in:
parent
37bfe50fe2
commit
f793af2d39
File diff suppressed because one or more lines are too long
@ -26,36 +26,6 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "cfg.h"
|
#include "cfg.h"
|
||||||
|
|
||||||
/*! \struct ftgxCharData_
|
|
||||||
*
|
|
||||||
* Font face character glyph relevant data structure.
|
|
||||||
*/
|
|
||||||
typedef struct ftgxCharData_ {
|
|
||||||
int16_t renderOffsetX; /**< Texture X axis bearing offset. */
|
|
||||||
uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */
|
|
||||||
uint16_t glyphIndex; /**< Charachter glyph index in the font face. */
|
|
||||||
|
|
||||||
uint16_t textureWidth; /**< Texture width in pixels/bytes. */
|
|
||||||
uint16_t textureHeight; /**< Texture glyph height in pixels/bytes. */
|
|
||||||
|
|
||||||
int16_t renderOffsetY; /**< Texture Y axis bearing offset. */
|
|
||||||
int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */
|
|
||||||
int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */
|
|
||||||
|
|
||||||
uint32_t* glyphDataTexture; /**< Glyph texture bitmap data buffer. */
|
|
||||||
} ftgxCharData;
|
|
||||||
|
|
||||||
/*! \struct ftgxDataOffset_
|
|
||||||
*
|
|
||||||
* Offset structure which hold both a maximum and minimum value.
|
|
||||||
*/
|
|
||||||
typedef struct ftgxDataOffset_ {
|
|
||||||
int16_t ascender; /**< Maximum data offset. */
|
|
||||||
int16_t descender; /**< Minimum data offset. */
|
|
||||||
int16_t max; /**< Maximum data offset. */
|
|
||||||
int16_t min; /**< Minimum data offset. */
|
|
||||||
} ftgxDataOffset;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor for the FreeTypeGX class.
|
* Default constructor for the FreeTypeGX class.
|
||||||
@ -437,16 +407,16 @@ void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) {
|
|||||||
* @param width Current pixel width of the string.
|
* @param width Current pixel width of the string.
|
||||||
* @param format Positional format of the string.
|
* @param format Positional format of the string.
|
||||||
*/
|
*/
|
||||||
int16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) {
|
uint16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) {
|
||||||
|
|
||||||
if (format & FTGX_JUSTIFY_LEFT ) {
|
if (format & FTGX_JUSTIFY_LEFT ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (format & FTGX_JUSTIFY_CENTER ) {
|
else if (format & FTGX_JUSTIFY_CENTER ) {
|
||||||
return -(width >> 1);
|
return width >> 1;
|
||||||
}
|
}
|
||||||
else if (format & FTGX_JUSTIFY_RIGHT ) {
|
else if (format & FTGX_JUSTIFY_RIGHT ) {
|
||||||
return -width;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -460,31 +430,15 @@ int16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) {
|
|||||||
* @param offset Current pixel offset data of the string.
|
* @param offset Current pixel offset data of the string.
|
||||||
* @param format Positional format of the string.
|
* @param format Positional format of the string.
|
||||||
*/
|
*/
|
||||||
int16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format)
|
uint16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format) {
|
||||||
{
|
if (format & FTGX_ALIGN_TOP ) {
|
||||||
switch(format & FTGX_ALIGN_MASK)
|
return -offset.max;
|
||||||
{
|
}
|
||||||
case FTGX_ALIGN_TOP:
|
else if (format & FTGX_ALIGN_MIDDLE ) {
|
||||||
return offset->ascender;
|
return -offset.max;
|
||||||
|
}
|
||||||
default:
|
else if (format & FTGX_ALIGN_BOTTOM ) {
|
||||||
case FTGX_ALIGN_MIDDLE:
|
return offset.min;
|
||||||
return (offset->ascender + offset->descender + 1) >> 1;
|
|
||||||
|
|
||||||
case FTGX_ALIGN_BOTTOM:
|
|
||||||
return offset->descender;
|
|
||||||
|
|
||||||
case FTGX_ALIGN_BASELINE:
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case FTGX_ALIGN_GLYPH_TOP:
|
|
||||||
return offset->max;
|
|
||||||
|
|
||||||
case FTGX_ALIGN_GLYPH_MIDDLE:
|
|
||||||
return (offset->max + offset->min + 1) >> 1;
|
|
||||||
|
|
||||||
case FTGX_ALIGN_GLYPH_BOTTOM:
|
|
||||||
return offset->min;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -509,13 +463,12 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t *text, GXColor color
|
|||||||
uint16_t x_offset = 0, y_offset = 0;
|
uint16_t x_offset = 0, y_offset = 0;
|
||||||
GXTexObj glyphTexture;
|
GXTexObj glyphTexture;
|
||||||
FT_Vector pairDelta;
|
FT_Vector pairDelta;
|
||||||
ftgxDataOffset offset;
|
|
||||||
|
|
||||||
if(textStyle & FTGX_JUSTIFY_MASK) {
|
if(textStyle & 0x000F) {
|
||||||
x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle);
|
x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle);
|
||||||
}
|
}
|
||||||
if(textStyle & FTGX_ALIGN_MASK) {
|
if(textStyle & 0x00F0) {
|
||||||
y_offset = this->getStyleOffsetHeight(this->getOffset(text, &offset), textStyle);
|
y_offset = this->getStyleOffsetHeight(this->getOffset(text), textStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint16_t i = 0; i < strLength; i++) {
|
for (uint16_t i = 0; i < strLength; i++) {
|
||||||
@ -536,15 +489,15 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t *text, GXColor color
|
|||||||
}
|
}
|
||||||
|
|
||||||
GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, glyphData->textureHeight, this->textureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
|
GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, glyphData->textureHeight, this->textureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
|
||||||
this->copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos + glyphData->renderOffsetX + x_offset, y - glyphData->renderOffsetY + y_offset, color);
|
this->copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos + glyphData->renderOffsetX - x_offset, y - glyphData->renderOffsetY - y_offset, color);
|
||||||
|
|
||||||
x_pos += glyphData->glyphAdvanceX;
|
x_pos += glyphData->glyphAdvanceX;
|
||||||
printed++;
|
printed++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(textStyle & FTGX_STYLE_MASK) {
|
if(textStyle & 0x0F00) {
|
||||||
this->drawTextFeature(x + x_offset, y + y_offset, this->getWidth(text), this->getOffset(text, &offset), textStyle, color);
|
this->drawTextFeature(x - x_offset, y, this->getWidth(text), this->getOffset(text), textStyle, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
return printed;
|
return printed;
|
||||||
@ -557,22 +510,20 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t const *text, GXColor
|
|||||||
return this->drawText(x, y, (wchar_t *)text, color, textStyle);
|
return this->drawText(x, y, (wchar_t *)text, color, textStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color) {
|
void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color) {
|
||||||
uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1;
|
uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1;
|
||||||
|
|
||||||
if (format & FTGX_STYLE_UNDERLINE ) {
|
if (format & FTGX_STYLE_UNDERLINE ) {
|
||||||
switch(format & FTGX_ALIGN_MASK) {
|
switch(format & 0x00F0) {
|
||||||
/*
|
|
||||||
case FTGX_ALIGN_TOP:
|
case FTGX_ALIGN_TOP:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y + offsetData->max + 1, color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y + offsetData.max + 1, color);
|
||||||
break;
|
break;
|
||||||
case FTGX_ALIGN_MIDDLE:
|
case FTGX_ALIGN_MIDDLE:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData->max - offsetData->min + 1) >> 1), color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData.max - offsetData.min) >> 1) + 1, color);
|
||||||
break;
|
break;
|
||||||
case FTGX_ALIGN_BOTTOM:
|
case FTGX_ALIGN_BOTTOM:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y - offsetData->min, color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y - offsetData.min, color);
|
||||||
break;
|
break;
|
||||||
*/
|
|
||||||
default:
|
default:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y + 1, color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y + 1, color);
|
||||||
break;
|
break;
|
||||||
@ -580,21 +531,18 @@ void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataO
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (format & FTGX_STYLE_STRIKE ) {
|
if (format & FTGX_STYLE_STRIKE ) {
|
||||||
switch(format & FTGX_ALIGN_MASK) {
|
switch(format & 0x00F0) {
|
||||||
/*
|
|
||||||
case FTGX_ALIGN_TOP:
|
case FTGX_ALIGN_TOP:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData->max - offsetData->min + 1) >> 1), color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData.max + offsetData.min) >> 1), color);
|
||||||
break;
|
break;
|
||||||
case FTGX_ALIGN_MIDDLE:
|
case FTGX_ALIGN_MIDDLE:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y, color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y, color);
|
||||||
break;
|
break;
|
||||||
case FTGX_ALIGN_BOTTOM:
|
case FTGX_ALIGN_BOTTOM:
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max + offsetData->min) >> 1), color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData.max + offsetData.min) >> 1), color);
|
||||||
break;
|
break;
|
||||||
*/
|
|
||||||
default:
|
default:
|
||||||
// this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max - offsetData->min) >> 1), color);
|
this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData.max - offsetData.min) >> 1), color);
|
||||||
this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max) >> 1), color);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -655,10 +603,9 @@ uint16_t FreeTypeGX::getWidth(wchar_t const *text) {
|
|||||||
* @return The height of the text string in pixels.
|
* @return The height of the text string in pixels.
|
||||||
*/
|
*/
|
||||||
uint16_t FreeTypeGX::getHeight(wchar_t *text) {
|
uint16_t FreeTypeGX::getHeight(wchar_t *text) {
|
||||||
ftgxDataOffset offset;
|
ftgxDataOffset offset = this->getOffset(text);
|
||||||
this->getOffset(text, &offset);
|
|
||||||
|
|
||||||
return offset.max - offset.min;
|
return offset.max + offset.min;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -676,12 +623,11 @@ uint16_t FreeTypeGX::getHeight(wchar_t const *text) {
|
|||||||
* pixel height below the font origin line and returns the values in an addressible structure.
|
* pixel height below the font origin line and returns the values in an addressible structure.
|
||||||
*
|
*
|
||||||
* @param text NULL terminated string to calculate.
|
* @param text NULL terminated string to calculate.
|
||||||
* @param offset returns the max and min values above and below the font origin line
|
* @return The max and min values above and below the font origin line.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
ftgxDataOffset* FreeTypeGX::getOffset(wchar_t *text, ftgxDataOffset* offset) {
|
ftgxDataOffset FreeTypeGX::getOffset(wchar_t *text) {
|
||||||
uint16_t strLength = wcslen(text);
|
uint16_t strLength = wcslen(text);
|
||||||
int16_t strMax = 0, strMin = 9999;
|
int16_t strMax = 0, strMin = 0;
|
||||||
|
|
||||||
for (uint16_t i = 0; i < strLength; i++) {
|
for (uint16_t i = 0; i < strLength; i++) {
|
||||||
|
|
||||||
@ -695,22 +641,19 @@ ftgxDataOffset* FreeTypeGX::getOffset(wchar_t *text, ftgxDataOffset* offset) {
|
|||||||
|
|
||||||
if(glyphData != NULL) {
|
if(glyphData != NULL) {
|
||||||
strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax;
|
strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax;
|
||||||
strMin = glyphData->renderOffsetMin < strMin ? glyphData->renderOffsetMin : strMin;
|
strMin = glyphData->renderOffsetMin > strMin ? glyphData->renderOffsetMin : strMin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
offset->ascender = this->ftFace->size->metrics.ascender>>6;
|
|
||||||
offset->descender = this->ftFace->size->metrics.descender>>6;
|
return (ftgxDataOffset){strMax, strMin};
|
||||||
offset->max = strMax;
|
|
||||||
offset->min = strMin;
|
|
||||||
return offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* \overload
|
* \overload
|
||||||
*/
|
*/
|
||||||
ftgxDataOffset* FreeTypeGX::getOffset(wchar_t const *text, ftgxDataOffset* offset) {
|
ftgxDataOffset FreeTypeGX::getOffset(wchar_t const *text) {
|
||||||
return this->getOffset(text, offset);
|
return this->getOffset(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
* along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>.
|
* along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/** \mainpage FreeTypeGX
|
/** \mainpage FreeTypeGX
|
||||||
*
|
*
|
||||||
* \section sec_intro Introduction
|
* \section sec_intro Introduction
|
||||||
@ -161,32 +162,47 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
/*! forward deklaration of private structures
|
/*! \struct ftgxCharData_
|
||||||
*
|
*
|
||||||
|
* Font face character glyph relevant data structure.
|
||||||
*/
|
*/
|
||||||
typedef struct ftgxCharData_ ftgxCharData;
|
typedef struct ftgxCharData_ {
|
||||||
typedef struct ftgxDataOffset_ ftgxDataOffset;
|
int16_t renderOffsetX; /**< Texture X axis bearing offset. */
|
||||||
|
uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */
|
||||||
|
uint16_t glyphIndex; /**< Charachter glyph index in the font face. */
|
||||||
|
|
||||||
|
uint16_t textureWidth; /**< Texture width in pixels/bytes. */
|
||||||
|
uint16_t textureHeight; /**< Texture glyph height in pixels/bytes. */
|
||||||
|
|
||||||
|
int16_t renderOffsetY; /**< Texture Y axis bearing offset. */
|
||||||
|
int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */
|
||||||
|
int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */
|
||||||
|
|
||||||
|
uint32_t* glyphDataTexture; /**< Glyph texture bitmap data buffer. */
|
||||||
|
} ftgxCharData;
|
||||||
|
|
||||||
|
/*! \struct ftgxDataOffset_
|
||||||
|
*
|
||||||
|
* Offset structure which hold both a maximum and minimum value.
|
||||||
|
*/
|
||||||
|
typedef struct ftgxDataOffset_ {
|
||||||
|
int16_t max; /**< Maximum data offset. */
|
||||||
|
int16_t min; /**< Minimum data offset. */
|
||||||
|
} ftgxDataOffset;
|
||||||
|
|
||||||
#define _TEXT(t) L ## t /**< Unicode helper macro. */
|
#define _TEXT(t) L ## t /**< Unicode helper macro. */
|
||||||
|
|
||||||
#define FTGX_NULL 0x0000
|
#define FTGX_NULL 0x0000
|
||||||
#define FTGX_JUSTIFY_LEFT 0x0001
|
#define FTGX_JUSTIFY_LEFT 0x0001
|
||||||
#define FTGX_JUSTIFY_CENTER 0x0002
|
#define FTGX_JUSTIFY_CENTER 0x0002
|
||||||
#define FTGX_JUSTIFY_RIGHT 0x0003
|
#define FTGX_JUSTIFY_RIGHT 0x0004
|
||||||
#define FTGX_JUSTIFY_MASK 0x000f
|
|
||||||
|
|
||||||
#define FTGX_ALIGN_TOP 0x0010
|
#define FTGX_ALIGN_TOP 0x0010
|
||||||
#define FTGX_ALIGN_MIDDLE 0x0020
|
#define FTGX_ALIGN_MIDDLE 0x0020
|
||||||
#define FTGX_ALIGN_BOTTOM 0x0030
|
#define FTGX_ALIGN_BOTTOM 0x0040
|
||||||
#define FTGX_ALIGN_BASELINE 0x0040
|
|
||||||
#define FTGX_ALIGN_GLYPH_TOP 0x0050
|
|
||||||
#define FTGX_ALIGN_GLYPH_MIDDLE 0x0060
|
|
||||||
#define FTGX_ALIGN_GLYPH_BOTTOM 0x0070
|
|
||||||
#define FTGX_ALIGN_MASK 0x00f0
|
|
||||||
|
|
||||||
#define FTGX_STYLE_UNDERLINE 0x0100
|
#define FTGX_STYLE_UNDERLINE 0x0100
|
||||||
#define FTGX_STYLE_STRIKE 0x0200
|
#define FTGX_STYLE_STRIKE 0x0200
|
||||||
#define FTGX_STYLE_MASK 0x0f00
|
|
||||||
|
|
||||||
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001
|
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001
|
||||||
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002
|
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002
|
||||||
@ -231,8 +247,8 @@ class FreeTypeGX {
|
|||||||
static uint16_t adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat);
|
static uint16_t adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat);
|
||||||
static uint16_t adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat);
|
static uint16_t adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat);
|
||||||
|
|
||||||
static int16_t getStyleOffsetWidth(uint16_t width, uint16_t format);
|
static uint16_t getStyleOffsetWidth(uint16_t width, uint16_t format);
|
||||||
static int16_t getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format);
|
static uint16_t getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format);
|
||||||
|
|
||||||
void unloadFont();
|
void unloadFont();
|
||||||
ftgxCharData *cacheGlyphData(wchar_t charCode);
|
ftgxCharData *cacheGlyphData(wchar_t charCode);
|
||||||
@ -241,7 +257,7 @@ class FreeTypeGX {
|
|||||||
|
|
||||||
void setDefaultMode();
|
void setDefaultMode();
|
||||||
|
|
||||||
void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color);
|
void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color);
|
||||||
void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color);
|
void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color);
|
||||||
void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color);
|
void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color);
|
||||||
|
|
||||||
@ -265,8 +281,8 @@ class FreeTypeGX {
|
|||||||
uint16_t getWidth(wchar_t const *text);
|
uint16_t getWidth(wchar_t const *text);
|
||||||
uint16_t getHeight(wchar_t *text);
|
uint16_t getHeight(wchar_t *text);
|
||||||
uint16_t getHeight(wchar_t const *text);
|
uint16_t getHeight(wchar_t const *text);
|
||||||
ftgxDataOffset* getOffset(wchar_t *text, ftgxDataOffset* offset);
|
ftgxDataOffset getOffset(wchar_t *text);
|
||||||
ftgxDataOffset* getOffset(wchar_t const *text, ftgxDataOffset* offset);
|
ftgxDataOffset getOffset(wchar_t const *text);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FREETYPEGX_H_ */
|
#endif /* FREETYPEGX_H_ */
|
||||||
|
@ -244,6 +244,7 @@ void CFG_Default(int widescreen) // -1 = non forced Mode
|
|||||||
snprintf(CFG.unlockCode, sizeof(CFG.unlockCode), "ab121b"); // default password
|
snprintf(CFG.unlockCode, sizeof(CFG.unlockCode), "ab121b"); // default password
|
||||||
snprintf(CFG.language_path, sizeof(CFG.language_path), "SD:/config/language/");
|
snprintf(CFG.language_path, sizeof(CFG.language_path), "SD:/config/language/");
|
||||||
snprintf(CFG.oggload_path, sizeof(CFG.oggload_path), "SD:/config/backgroundmusic/");
|
snprintf(CFG.oggload_path, sizeof(CFG.oggload_path), "SD:/config/backgroundmusic/");
|
||||||
|
snprintf(CFG.update_path, sizeof(CFG.update_path), "SD:/apps/usbloader_gx/");
|
||||||
sprintf(CFG.ogg_path, "notset");
|
sprintf(CFG.ogg_path, "notset");
|
||||||
|
|
||||||
CFG.parentalcontrol = 0;
|
CFG.parentalcontrol = 0;
|
||||||
@ -494,6 +495,10 @@ void cfg_set(char *name, char *val)
|
|||||||
strcopy(CFG.language_path, val, sizeof(CFG.language_path));
|
strcopy(CFG.language_path, val, sizeof(CFG.language_path));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (strcmp(name, "update_path") == 0) {
|
||||||
|
strcopy(CFG.update_path, val, sizeof(CFG.update_path));
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (strcmp(name, "oggload_path") == 0) {
|
if (strcmp(name, "oggload_path") == 0) {
|
||||||
strcopy(CFG.oggload_path, val, sizeof(CFG.oggload_path));
|
strcopy(CFG.oggload_path, val, sizeof(CFG.oggload_path));
|
||||||
return;
|
return;
|
||||||
@ -1090,6 +1095,7 @@ bool cfg_save_global()// save global settings
|
|||||||
fprintf(f, "ogg_path = %s\n ", CFG.ogg_path);
|
fprintf(f, "ogg_path = %s\n ", CFG.ogg_path);
|
||||||
fprintf(f, "wiilight = %d\n ", Settings.wiilight);
|
fprintf(f, "wiilight = %d\n ", Settings.wiilight);
|
||||||
fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay);
|
fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay);
|
||||||
|
fprintf(f, "update_path = %s\n ", CFG.update_path);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,7 @@ struct CFG
|
|||||||
char language_path[100];
|
char language_path[100];
|
||||||
char oggload_path[100];
|
char oggload_path[100];
|
||||||
char ogg_path[150];
|
char ogg_path[150];
|
||||||
|
char update_path[150];
|
||||||
short keyset;
|
short keyset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ return -1;
|
|||||||
void SDCard_deInit()
|
void SDCard_deInit()
|
||||||
{
|
{
|
||||||
//First unmount all the devs...
|
//First unmount all the devs...
|
||||||
fatUnmount("SD");
|
fatUnmount("SD:/");
|
||||||
//...and then shutdown em!
|
//...and then shutdown em!
|
||||||
__io_wiisd.shutdown();
|
__io_wiisd.shutdown();
|
||||||
}
|
}
|
||||||
|
@ -287,4 +287,7 @@ extern const u32 arrangeList_gray_png_size;
|
|||||||
extern const u8 arrangeCarosselle_gray_png[];
|
extern const u8 arrangeCarosselle_gray_png[];
|
||||||
extern const u32 arrangeCarosselle_gray_png_size;
|
extern const u32 arrangeCarosselle_gray_png_size;
|
||||||
|
|
||||||
|
extern const u8 updateRev_png[];
|
||||||
|
extern const u32 updateRev_png_size;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -232,3 +232,14 @@ struct block downloadfile(const char *url)
|
|||||||
|
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 GetConnection(char * domain) {
|
||||||
|
|
||||||
|
u32 ipaddress = getipbynamecached(domain);
|
||||||
|
if(ipaddress == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
s32 connection = server_connect(ipaddress, 80);
|
||||||
|
return connection;
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -30,6 +30,7 @@ struct block
|
|||||||
extern const struct block emptyblock;
|
extern const struct block emptyblock;
|
||||||
|
|
||||||
struct block downloadfile(const char *url);
|
struct block downloadfile(const char *url);
|
||||||
|
s32 GetConnection(char * domain);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
@ -74,7 +74,7 @@ snprintf(LANGUAGE.Display, sizeof(LANGUAGE.Display), "Display");
|
|||||||
snprintf(LANGUAGE.Doyouwanttoformat, sizeof(LANGUAGE.Doyouwanttoformat), "Do you want to format:");
|
snprintf(LANGUAGE.Doyouwanttoformat, sizeof(LANGUAGE.Doyouwanttoformat), "Do you want to format:");
|
||||||
snprintf(LANGUAGE.Doyoureallywanttodelete, sizeof(LANGUAGE.Doyoureallywanttodelete), "Do you really want to delete:");
|
snprintf(LANGUAGE.Doyoureallywanttodelete, sizeof(LANGUAGE.Doyoureallywanttodelete), "Do you really want to delete:");
|
||||||
snprintf(LANGUAGE.Doyouwanttoretryfor30secs, sizeof(LANGUAGE.Doyouwanttoretryfor30secs), "Do you want to retry for 30 secs?");
|
snprintf(LANGUAGE.Doyouwanttoretryfor30secs, sizeof(LANGUAGE.Doyouwanttoretryfor30secs), "Do you want to retry for 30 secs?");
|
||||||
snprintf(LANGUAGE.Downloadingfile, sizeof(LANGUAGE.Downloadingfile), "Downloading file:");
|
snprintf(LANGUAGE.Downloadingfile, sizeof(LANGUAGE.Downloadingfile), "Downloading file");
|
||||||
snprintf(LANGUAGE.DownloadBoxartimage, sizeof(LANGUAGE.DownloadBoxartimage), "Download Boxart image?");
|
snprintf(LANGUAGE.DownloadBoxartimage, sizeof(LANGUAGE.DownloadBoxartimage), "Download Boxart image?");
|
||||||
snprintf(LANGUAGE.Downloadfinished, sizeof(LANGUAGE.Downloadfinished), "Download finished");
|
snprintf(LANGUAGE.Downloadfinished, sizeof(LANGUAGE.Downloadfinished), "Download finished");
|
||||||
snprintf(LANGUAGE.Defaultgamesettings, sizeof(LANGUAGE.Defaultgamesettings), "Default Gamesettings");
|
snprintf(LANGUAGE.Defaultgamesettings, sizeof(LANGUAGE.Defaultgamesettings), "Default Gamesettings");
|
||||||
@ -202,6 +202,9 @@ snprintf(LANGUAGE.Timeleft, sizeof(LANGUAGE.Timeleft), "Time left:");
|
|||||||
snprintf(LANGUAGE.Unlock, sizeof(LANGUAGE.Unlock), "Unlock");
|
snprintf(LANGUAGE.Unlock, sizeof(LANGUAGE.Unlock), "Unlock");
|
||||||
snprintf(LANGUAGE.Unicodefix, sizeof(LANGUAGE.Unicodefix), "Unicode Fix");
|
snprintf(LANGUAGE.Unicodefix, sizeof(LANGUAGE.Unicodefix), "Unicode Fix");
|
||||||
snprintf(LANGUAGE.Uninstall, sizeof(LANGUAGE.Uninstall), "Uninstall");
|
snprintf(LANGUAGE.Uninstall, sizeof(LANGUAGE.Uninstall), "Uninstall");
|
||||||
|
snprintf(LANGUAGE.Updatepath, sizeof(LANGUAGE.Updatepath), "Updatepath");
|
||||||
|
snprintf(LANGUAGE.Updatepathchanged, sizeof(LANGUAGE.Updatepathchanged), "Updatepath changed.");
|
||||||
|
snprintf(LANGUAGE.Updatefailed, sizeof(LANGUAGE.Updatefailed), "Update failed");
|
||||||
snprintf(LANGUAGE.USBLoaderisprotected, sizeof(LANGUAGE.USBLoaderisprotected), "USB Loader GX is protected");
|
snprintf(LANGUAGE.USBLoaderisprotected, sizeof(LANGUAGE.USBLoaderisprotected), "USB Loader GX is protected");
|
||||||
snprintf(LANGUAGE.USBDevicenotfound, sizeof(LANGUAGE.USBDevicenotfound), "USB Device not found");
|
snprintf(LANGUAGE.USBDevicenotfound, sizeof(LANGUAGE.USBDevicenotfound), "USB Device not found");
|
||||||
snprintf(LANGUAGE.VideoMode, sizeof(LANGUAGE.VideoMode), "Video Mode");
|
snprintf(LANGUAGE.VideoMode, sizeof(LANGUAGE.VideoMode), "Video Mode");
|
||||||
@ -936,6 +939,18 @@ void language_set(char *name, char *val)
|
|||||||
strcopy(LANGUAGE.Uninstall, val, sizeof(LANGUAGE.Uninstall));
|
strcopy(LANGUAGE.Uninstall, val, sizeof(LANGUAGE.Uninstall));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (strcmp(name, "Updatepath") == 0) {
|
||||||
|
strcopy(LANGUAGE.Updatepath, val, sizeof(LANGUAGE.Updatepath));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp(name, "Updatepathchanged") == 0) {
|
||||||
|
strcopy(LANGUAGE.Updatepathchanged, val, sizeof(LANGUAGE.Updatepathchanged));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp(name, "Updatefailed") == 0) {
|
||||||
|
strcopy(LANGUAGE.Updatefailed, val, sizeof(LANGUAGE.Updatefailed));
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (strcmp(name, "USBLoaderisprotected") == 0) {
|
if (strcmp(name, "USBLoaderisprotected") == 0) {
|
||||||
strcopy(LANGUAGE.USBLoaderisprotected, val, sizeof(LANGUAGE.USBLoaderisprotected));
|
strcopy(LANGUAGE.USBLoaderisprotected, val, sizeof(LANGUAGE.USBLoaderisprotected));
|
||||||
return;
|
return;
|
||||||
|
@ -188,6 +188,9 @@ struct LANGUAGE
|
|||||||
char Uninstall[50];
|
char Uninstall[50];
|
||||||
char USBLoaderisprotected[80];
|
char USBLoaderisprotected[80];
|
||||||
char USBDevicenotfound[80];
|
char USBDevicenotfound[80];
|
||||||
|
char Updatepath[50];
|
||||||
|
char Updatepathchanged[50];
|
||||||
|
char Updatefailed[40];
|
||||||
char VideoMode[50];
|
char VideoMode[50];
|
||||||
char VIDTVPatch[50];
|
char VIDTVPatch[50];
|
||||||
char Volume[50];
|
char Volume[50];
|
||||||
|
@ -664,7 +664,7 @@ class GuiText : public GuiElement
|
|||||||
//!\param s Font style
|
//!\param s Font style
|
||||||
//!\param h Text alignment (horizontal)
|
//!\param h Text alignment (horizontal)
|
||||||
//!\param v Text alignment (vertical)
|
//!\param v Text alignment (vertical)
|
||||||
static void SetPresets(int sz, GXColor c, int w, int wrap, u16 s, int h, int v);
|
void SetPresets(int sz, GXColor c, int w, u16 s, int h, int v);
|
||||||
//!Sets the font size
|
//!Sets the font size
|
||||||
//!\param s Font size
|
//!\param s Font size
|
||||||
void SetFontSize(int s);
|
void SetFontSize(int s);
|
||||||
@ -672,12 +672,14 @@ class GuiText : public GuiElement
|
|||||||
//!If the text exceeds this, it is wrapped to the next line
|
//!If the text exceeds this, it is wrapped to the next line
|
||||||
//!\param w Maximum width
|
//!\param w Maximum width
|
||||||
//!\param m WrapMode
|
//!\param m WrapMode
|
||||||
|
/*
|
||||||
enum {
|
enum {
|
||||||
WRAP,
|
WRAP,
|
||||||
DOTTED,
|
DOTTED,
|
||||||
SCROLL,
|
SCROLL,
|
||||||
MARQUEE
|
MARQUEE
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
void SetMaxWidth(int w, short m=GuiText::WRAP);
|
void SetMaxWidth(int w, short m=GuiText::WRAP);
|
||||||
//!Sets the font color
|
//!Sets the font color
|
||||||
//!\param c Font color
|
//!\param c Font color
|
||||||
@ -685,7 +687,7 @@ class GuiText : public GuiElement
|
|||||||
//!Sets the FreeTypeGX style attributes
|
//!Sets the FreeTypeGX style attributes
|
||||||
//!\param s Style attributes
|
//!\param s Style attributes
|
||||||
//!\param m Style-Mask attributes
|
//!\param m Style-Mask attributes
|
||||||
void SetStyle(u16 s, u16 m=0xffff);
|
void SetStyle(u16 s/*, u16 m=0xffff*/);
|
||||||
//!Sets the text alignment
|
//!Sets the text alignment
|
||||||
//!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE)
|
//!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE)
|
||||||
//!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE)
|
//!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE)
|
||||||
@ -699,6 +701,12 @@ class GuiText : public GuiElement
|
|||||||
void SetWidescreen(bool w);
|
void SetWidescreen(bool w);
|
||||||
//!Constantly called to draw the text
|
//!Constantly called to draw the text
|
||||||
void Draw();
|
void Draw();
|
||||||
|
enum {
|
||||||
|
WRAP,
|
||||||
|
DOTTED,
|
||||||
|
SCROLL,
|
||||||
|
MARQUEE
|
||||||
|
};
|
||||||
protected:
|
protected:
|
||||||
wchar_t* text; //!< Unicode text value
|
wchar_t* text; //!< Unicode text value
|
||||||
int size; //!< Font size
|
int size; //!< Font size
|
||||||
|
@ -13,12 +13,12 @@
|
|||||||
static int currentSize = 0;
|
static int currentSize = 0;
|
||||||
static int currentWidescreen = 0;
|
static int currentWidescreen = 0;
|
||||||
static int presetSize = 0;
|
static int presetSize = 0;
|
||||||
static GXColor presetColor = (GXColor){255, 255, 255, 255};
|
|
||||||
static int presetMaxWidth = 0;
|
static int presetMaxWidth = 0;
|
||||||
static int presetWrapMode = 0;
|
static int presetWrapMode = GuiText::WRAP;
|
||||||
static u16 presetStyle = 0;
|
|
||||||
static int presetAlignmentHor = 0;
|
static int presetAlignmentHor = 0;
|
||||||
static int presetAlignmentVert = 0;
|
static int presetAlignmentVert = 0;
|
||||||
|
static u16 presetStyle = 0;
|
||||||
|
static GXColor presetColor = (GXColor){255, 255, 255, 255};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for the GuiText class.
|
* Constructor for the GuiText class.
|
||||||
@ -35,14 +35,14 @@ GuiText::GuiText(const char * t, int s, GXColor c)
|
|||||||
scrollPos1 = 0;
|
scrollPos1 = 0;
|
||||||
scrollPos2 = 0;
|
scrollPos2 = 0;
|
||||||
scrollDelay = 0;
|
scrollDelay = 0;
|
||||||
font = fontSystem;
|
font = NULL;
|
||||||
widescreen = 0; //added
|
widescreen = 0; //added
|
||||||
|
|
||||||
alignmentHor = ALIGN_CENTRE;
|
alignmentHor = ALIGN_CENTRE;
|
||||||
alignmentVert = ALIGN_MIDDLE;
|
alignmentVert = ALIGN_MIDDLE;
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
text = FreeTypeGX::charToWideChar((char *)t);
|
text = fontSystem->charToWideChar((char *)t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,14 +60,14 @@ GuiText::GuiText(const char * t)
|
|||||||
scrollPos1 = 0;
|
scrollPos1 = 0;
|
||||||
scrollPos2 = 0;
|
scrollPos2 = 0;
|
||||||
scrollDelay = 0;
|
scrollDelay = 0;
|
||||||
font = fontSystem;
|
font = NULL;
|
||||||
widescreen = 0; //added
|
widescreen = 0; //added
|
||||||
|
|
||||||
alignmentHor = presetAlignmentHor;
|
alignmentHor = presetAlignmentHor;
|
||||||
alignmentVert = presetAlignmentVert;
|
alignmentVert = presetAlignmentVert;
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
text = FreeTypeGX::charToWideChar((char *)t);
|
text = fontSystem->charToWideChar((char *)t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -90,18 +90,17 @@ void GuiText::SetText(const char * t)
|
|||||||
text = NULL;
|
text = NULL;
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
text = FreeTypeGX::charToWideChar((char *)t);
|
text = fontSystem->charToWideChar((char *)t);
|
||||||
scrollPos2 = 0;
|
scrollPos2 = 0;
|
||||||
scrollDelay = 0;
|
scrollDelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiText::SetPresets(int sz, GXColor c, int w, int wrap, u16 s, int h, int v)
|
void GuiText::SetPresets(int sz, GXColor c, int w, u16 s, int h, int v)
|
||||||
{
|
{
|
||||||
presetSize = sz;
|
presetSize = sz;
|
||||||
presetColor = c;
|
presetColor = c;
|
||||||
presetMaxWidth = w;
|
|
||||||
presetWrapMode = wrap;
|
|
||||||
presetStyle = s;
|
presetStyle = s;
|
||||||
|
presetMaxWidth = w;
|
||||||
presetAlignmentHor = h;
|
presetAlignmentHor = h;
|
||||||
presetAlignmentVert = v;
|
presetAlignmentVert = v;
|
||||||
}
|
}
|
||||||
@ -126,17 +125,16 @@ void GuiText::SetColor(GXColor c)
|
|||||||
alpha = c.a;
|
alpha = c.a;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiText::SetStyle(u16 s, u16 m/*=0xffff*/)
|
void GuiText::SetStyle(u16 s)
|
||||||
{
|
{
|
||||||
LOCK(this);
|
LOCK(this);
|
||||||
style &= ~m;
|
style = s;
|
||||||
style |= s & m;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiText::SetAlignment(int hor, int vert)
|
void GuiText::SetAlignment(int hor, int vert)
|
||||||
{
|
{
|
||||||
LOCK(this);
|
LOCK(this);
|
||||||
style = FTGX_NULL;
|
style = 0;
|
||||||
|
|
||||||
switch(hor)
|
switch(hor)
|
||||||
{
|
{
|
||||||
@ -172,7 +170,7 @@ void GuiText::SetAlignment(int hor, int vert)
|
|||||||
void GuiText::SetFont(FreeTypeGX *f)
|
void GuiText::SetFont(FreeTypeGX *f)
|
||||||
{
|
{
|
||||||
LOCK(this);
|
LOCK(this);
|
||||||
font = f ? f : fontSystem;
|
font = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GuiText::GetTextWidth()
|
int GuiText::GetTextWidth()
|
||||||
@ -182,11 +180,12 @@ int GuiText::GetTextWidth()
|
|||||||
|
|
||||||
if(newSize != currentSize || currentWidescreen != widescreen)
|
if(newSize != currentSize || currentWidescreen != widescreen)
|
||||||
{
|
{
|
||||||
font->changeSize(newSize, widescreen ? newSize*0.8 : 0);
|
//fontSystem->changeSize(newSize);
|
||||||
|
(font ? font : fontSystem)->changeSize(newSize, widescreen ? newSize*0.8 : 0);
|
||||||
currentSize = newSize;
|
currentSize = newSize;
|
||||||
currentWidescreen = widescreen;
|
currentWidescreen = widescreen;
|
||||||
}
|
}
|
||||||
return font->getWidth(text);
|
return (font ? font : fontSystem)->getWidth(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiText::SetWidescreen(bool w)
|
void GuiText::SetWidescreen(bool w)
|
||||||
@ -213,17 +212,18 @@ void GuiText::Draw()
|
|||||||
|
|
||||||
if(newSize != currentSize || currentWidescreen != widescreen)
|
if(newSize != currentSize || currentWidescreen != widescreen)
|
||||||
{
|
{
|
||||||
font->changeSize(newSize, widescreen ? newSize*0.8 : 0);
|
//fontSystem->changeSize(newSize);
|
||||||
|
(font ? font : fontSystem)->changeSize(newSize, widescreen ? newSize*0.8 : 0);
|
||||||
currentSize = newSize;
|
currentSize = newSize;
|
||||||
currentWidescreen = widescreen;
|
currentWidescreen = widescreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int voffset = 0;
|
int voffset = 0;
|
||||||
|
|
||||||
// if(alignmentVert == ALIGN_MIDDLE)
|
if(alignmentVert == ALIGN_MIDDLE)
|
||||||
// voffset = -newSize/2 + 2;
|
voffset = -newSize/2 + 2;
|
||||||
|
|
||||||
if(maxWidth > 0 && font->getWidth(text) > maxWidth)
|
if(maxWidth > 0 && (font ? font : fontSystem)->getWidth(text) > maxWidth)
|
||||||
{
|
{
|
||||||
if(wrapMode == GuiText::WRAP) // text wrapping
|
if(wrapMode == GuiText::WRAP) // text wrapping
|
||||||
{
|
{
|
||||||
@ -246,7 +246,8 @@ void GuiText::Draw()
|
|||||||
|
|
||||||
if(text[ch] == ' ' || ch == strlen-1)
|
if(text[ch] == ' ' || ch == strlen-1)
|
||||||
{
|
{
|
||||||
if(font->getWidth(tmptext[linenum]) >= maxWidth)
|
if((font ? font : fontSystem)->getWidth(tmptext[linenum]) >= maxWidth)
|
||||||
|
//if(fontSystem->getWidth(tmptext[linenum]) >= maxWidth)
|
||||||
{
|
{
|
||||||
if(lastSpace >= 0)
|
if(lastSpace >= 0)
|
||||||
{
|
{
|
||||||
@ -277,7 +278,7 @@ void GuiText::Draw()
|
|||||||
|
|
||||||
for(i=0; i < linenum; i++)
|
for(i=0; i < linenum; i++)
|
||||||
{
|
{
|
||||||
font->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style);
|
(font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style);
|
||||||
delete tmptext[i];
|
delete tmptext[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -295,9 +296,9 @@ void GuiText::Draw()
|
|||||||
save[i] = text[dotPos+i];
|
save[i] = text[dotPos+i];
|
||||||
text[dotPos+i] = (i != 3 ? _TEXT('.') : 0);
|
text[dotPos+i] = (i != 3 ? _TEXT('.') : 0);
|
||||||
}
|
}
|
||||||
if((font->getWidth(text)) <= maxWidth)
|
if(((font ? font : fontSystem)->getWidth(text)) <= maxWidth)
|
||||||
{
|
{
|
||||||
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
|
(font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
|
||||||
drawed = true;
|
drawed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,7 +307,7 @@ void GuiText::Draw()
|
|||||||
dotPos--;
|
dotPos--;
|
||||||
}
|
}
|
||||||
if(!drawed)
|
if(!drawed)
|
||||||
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
|
(font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
|
||||||
}
|
}
|
||||||
else if(wrapMode == GuiText::SCROLL) // text scroller
|
else if(wrapMode == GuiText::SCROLL) // text scroller
|
||||||
{
|
{
|
||||||
@ -315,12 +316,11 @@ void GuiText::Draw()
|
|||||||
if(scrollPos2 == 0 || frameCount > scrollDelay+5)
|
if(scrollPos2 == 0 || frameCount > scrollDelay+5)
|
||||||
{
|
{
|
||||||
scrollPos1 = 0;
|
scrollPos1 = 0;
|
||||||
scrollOffset = 0;
|
|
||||||
for(scrollPos2 = wcslen(text); scrollPos2 > 1; scrollPos2--)
|
for(scrollPos2 = wcslen(text); scrollPos2 > 1; scrollPos2--)
|
||||||
{
|
{
|
||||||
save = text[scrollPos2]; // save Pos2
|
save = text[scrollPos2]; // save Pos2
|
||||||
text[scrollPos2] = 0;
|
text[scrollPos2] = 0;
|
||||||
int textWidth = font->getWidth(text);
|
int textWidth = (font ? font : fontSystem)->getWidth(text);
|
||||||
text[scrollPos2] = save; // restore Pos2
|
text[scrollPos2] = save; // restore Pos2
|
||||||
if(textWidth <= maxWidth)
|
if(textWidth <= maxWidth)
|
||||||
break;
|
break;
|
||||||
@ -329,22 +329,15 @@ void GuiText::Draw()
|
|||||||
}
|
}
|
||||||
else if(scrollPos2 > 0 && frameCount >= scrollDelay)
|
else if(scrollPos2 > 0 && frameCount >= scrollDelay)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(--scrollOffset < 0)
|
|
||||||
{
|
|
||||||
wchar_t tmp[] = { text[scrollPos1], text[scrollPos1+1], 0 };
|
|
||||||
scrollOffset += font->getWidth(tmp) - font->getWidth(tmp+1);
|
|
||||||
scrollPos1++;
|
scrollPos1++;
|
||||||
}
|
|
||||||
|
|
||||||
int strlen = wcslen(text);
|
int strlen = wcslen(text);
|
||||||
for(; scrollPos2 < strlen; scrollPos2++)
|
for(; scrollPos2 < strlen; scrollPos2++)
|
||||||
{
|
{
|
||||||
save = text[scrollPos2+1]; // save Pos2
|
save = text[scrollPos2+1]; // save Pos2
|
||||||
text[scrollPos2+1] = 0;
|
text[scrollPos2+1] = 0;
|
||||||
int textWidth = font->getWidth(&text[scrollPos1]);
|
int textWidth = (font ? font : fontSystem)->getWidth(&text[scrollPos1]);
|
||||||
text[scrollPos2+1] = save; // restore Pos2
|
text[scrollPos2+1] = save; // restore Pos2
|
||||||
if(textWidth+scrollOffset > maxWidth)
|
if(textWidth > maxWidth)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(scrollPos2 == strlen)
|
if(scrollPos2 == strlen)
|
||||||
@ -353,28 +346,20 @@ void GuiText::Draw()
|
|||||||
scrollDelay = frameCount+25; // when dir-change wait 25 Frames
|
scrollDelay = frameCount+25; // when dir-change wait 25 Frames
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
scrollDelay = frameCount+1; // wait 1 Frames
|
scrollDelay = frameCount+10; // wait 10 Frames
|
||||||
}
|
}
|
||||||
else if(frameCount >= scrollDelay)
|
else if(frameCount >= scrollDelay)
|
||||||
{
|
{
|
||||||
scrollPos2 = -scrollPos2;
|
scrollPos2 = -scrollPos2;
|
||||||
|
|
||||||
scrollOffset++;
|
|
||||||
wchar_t tmp[] = { text[scrollPos1-1], text[scrollPos1], 0 };
|
|
||||||
int tmpOffset = font->getWidth(tmp) - font->getWidth(tmp+1);
|
|
||||||
if(scrollOffset >= tmpOffset)
|
|
||||||
{
|
|
||||||
scrollOffset -= tmpOffset;
|
|
||||||
scrollPos1--;
|
scrollPos1--;
|
||||||
}
|
|
||||||
|
|
||||||
for(; scrollPos2 > scrollPos1; scrollPos2--)
|
for(; scrollPos2 > scrollPos1; scrollPos2--)
|
||||||
{
|
{
|
||||||
save = text[scrollPos2]; // save Pos2
|
save = text[scrollPos2]; // save Pos2
|
||||||
text[scrollPos2] = 0;
|
text[scrollPos2] = 0;
|
||||||
int textWidth = font->getWidth(&text[scrollPos1]);
|
int textWidth = (font ? font : fontSystem)->getWidth(&text[scrollPos1]);
|
||||||
text[scrollPos2] = save; // restore Pos2
|
text[scrollPos2] = save; // restore Pos2
|
||||||
if(textWidth+scrollOffset <= maxWidth)
|
if(textWidth <= maxWidth)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(scrollPos1 == 0)
|
if(scrollPos1 == 0)
|
||||||
@ -383,34 +368,19 @@ void GuiText::Draw()
|
|||||||
scrollDelay = frameCount+25; // when dir-change wait 25 Frames
|
scrollDelay = frameCount+25; // when dir-change wait 25 Frames
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
scrollDelay = frameCount+1; // wait 10 Frames
|
scrollDelay = frameCount+10; // wait 10 Frames
|
||||||
|
|
||||||
scrollPos2 = -scrollPos2;
|
scrollPos2 = -scrollPos2;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t drawStyle = style;
|
|
||||||
uint16_t drawX = this->GetLeft() + scrollOffset;
|
|
||||||
|
|
||||||
if((drawStyle & FTGX_JUSTIFY_MASK) == FTGX_JUSTIFY_CENTER)
|
|
||||||
{
|
|
||||||
drawStyle = (drawStyle & ~FTGX_JUSTIFY_MASK) | FTGX_JUSTIFY_LEFT;
|
|
||||||
drawX -= maxWidth >> 1;
|
|
||||||
}
|
|
||||||
else if((drawStyle & FTGX_JUSTIFY_MASK) == FTGX_JUSTIFY_RIGHT)
|
|
||||||
{
|
|
||||||
drawStyle = (drawStyle & ~FTGX_JUSTIFY_MASK) | FTGX_JUSTIFY_LEFT;
|
|
||||||
drawX -= maxWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
save = text[abs(scrollPos2)]; // save Pos2
|
save = text[abs(scrollPos2)]; // save Pos2
|
||||||
text[abs(scrollPos2)] = 0;
|
text[abs(scrollPos2)] = 0;
|
||||||
font->drawText(drawX, this->GetTop()+voffset, &text[scrollPos1], c, drawStyle);
|
(font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, &text[scrollPos1], c, style);
|
||||||
text[abs(scrollPos2)] = save; // restore Pos2
|
text[abs(scrollPos2)] = save; // restore Pos2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
|
(font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
|
||||||
}
|
}
|
||||||
this->UpdateEffects();
|
this->UpdateEffects();
|
||||||
}
|
}
|
||||||
|
430
source/menu.cpp
430
source/menu.cpp
@ -42,6 +42,7 @@
|
|||||||
#include "libwiigui/gui_diskcover.h"
|
#include "libwiigui/gui_diskcover.h"
|
||||||
#include "mp3s.h"
|
#include "mp3s.h"
|
||||||
#include "fatmounter.h"
|
#include "fatmounter.h"
|
||||||
|
#include "updater.h"
|
||||||
|
|
||||||
#define MAX_CHARACTERS 38
|
#define MAX_CHARACTERS 38
|
||||||
extern FreeTypeGX *fontClock; //CLOCK
|
extern FreeTypeGX *fontClock; //CLOCK
|
||||||
@ -228,7 +229,7 @@ static void WindowCredits(void * ptr)
|
|||||||
txt[i] = new GuiText(LANGUAGE.OfficialSite, 20, (GXColor){255, 255, 255, 255});
|
txt[i] = new GuiText(LANGUAGE.OfficialSite, 20, (GXColor){255, 255, 255, 255});
|
||||||
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(-180,y); i++; y+=28;
|
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(-180,y); i++; y+=28;
|
||||||
|
|
||||||
GuiText::SetPresets(22, (GXColor){255, 255, 255, 255}, 0, GuiText::WRAP,
|
txt[i]->SetPresets(22, (GXColor){255, 255, 255, 255}, 0,
|
||||||
FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
||||||
|
|
||||||
txt[i] = new GuiText("Coding:");
|
txt[i] = new GuiText("Coding:");
|
||||||
@ -2173,9 +2174,9 @@ ProgressDownloadWindow(int choice2)
|
|||||||
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
|
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
|
||||||
progressbarImg.SetPosition(80,40);
|
progressbarImg.SetPosition(80,40);
|
||||||
progressbarImg.SetTile(80*i/cntMissFiles);
|
progressbarImg.SetTile(80*i/cntMissFiles);
|
||||||
|
} else {
|
||||||
|
progressbarImg.SetTile(100*i/cntMissFiles);
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
progressbarImg.SetTile(100*i/cntMissFiles);}
|
|
||||||
|
|
||||||
sprintf(msg, "%i %s", cntMissFiles - i, LANGUAGE.filesleft);
|
sprintf(msg, "%i %s", cntMissFiles - i, LANGUAGE.filesleft);
|
||||||
msgTxt.SetText(msg);
|
msgTxt.SetText(msg);
|
||||||
@ -2268,6 +2269,315 @@ ProgressDownloadWindow(int choice2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* ProgressWindow
|
||||||
|
*
|
||||||
|
* Opens a window, which displays progress to the user. Can either display a
|
||||||
|
* progress bar showing % completion, or a throbber that only shows that an
|
||||||
|
* action is in progress.
|
||||||
|
***************************************************************************/
|
||||||
|
int
|
||||||
|
ProgressUpdateWindow()
|
||||||
|
{
|
||||||
|
|
||||||
|
int ret = 0, failed = 0;
|
||||||
|
const unsigned int blocksize = 1024;
|
||||||
|
char hostip[16];
|
||||||
|
char * IP = NULL;
|
||||||
|
u8 blockbuffer[blocksize] ATTRIBUTE_ALIGN(32);
|
||||||
|
|
||||||
|
GuiWindow promptWindow(472,320);
|
||||||
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||||||
|
promptWindow.SetPosition(0, -10);
|
||||||
|
|
||||||
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
|
||||||
|
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
|
||||||
|
|
||||||
|
char imgPath[100];
|
||||||
|
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
|
||||||
|
GuiImageData btnOutline(imgPath, button_dialogue_box_png);
|
||||||
|
snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", CFG.theme_path);
|
||||||
|
GuiImageData dialogBox(imgPath, dialogue_box_png);
|
||||||
|
GuiTrigger trigA;
|
||||||
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
||||||
|
|
||||||
|
GuiImage dialogBoxImg(&dialogBox);
|
||||||
|
if (Settings.wsprompt == yes){
|
||||||
|
dialogBoxImg.SetWidescreen(CFG.widescreen);}
|
||||||
|
|
||||||
|
snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", CFG.theme_path);
|
||||||
|
GuiImageData progressbarOutline(imgPath, progressbar_outline_png);
|
||||||
|
GuiImage progressbarOutlineImg(&progressbarOutline);
|
||||||
|
if (Settings.wsprompt == yes){
|
||||||
|
progressbarOutlineImg.SetWidescreen(CFG.widescreen);}
|
||||||
|
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
||||||
|
progressbarOutlineImg.SetPosition(25, 7);
|
||||||
|
|
||||||
|
snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", CFG.theme_path);
|
||||||
|
GuiImageData progressbarEmpty(imgPath, progressbar_empty_png);
|
||||||
|
GuiImage progressbarEmptyImg(&progressbarEmpty);
|
||||||
|
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
||||||
|
progressbarEmptyImg.SetPosition(25, 7);
|
||||||
|
progressbarEmptyImg.SetTile(100);
|
||||||
|
|
||||||
|
snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
|
||||||
|
GuiImageData progressbar(imgPath, progressbar_png);
|
||||||
|
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
||||||
|
progressbarImg.SetPosition(25, 7);
|
||||||
|
|
||||||
|
char title[50];
|
||||||
|
sprintf(title, "%s", "Checking for Updates");
|
||||||
|
GuiText titleTxt(title, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
|
||||||
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
||||||
|
titleTxt.SetPosition(0,50);
|
||||||
|
char msg[50];
|
||||||
|
sprintf(msg, "%s", LANGUAGE.InitializingNetwork);
|
||||||
|
GuiText msgTxt(msg, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
|
||||||
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
||||||
|
msgTxt.SetPosition(0,140);
|
||||||
|
char msg2[50] = " ";
|
||||||
|
GuiText msg2Txt(msg2, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
|
||||||
|
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||||||
|
msg2Txt.SetPosition(0, 50);
|
||||||
|
|
||||||
|
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||||||
|
prTxt.SetPosition(0, 7);
|
||||||
|
|
||||||
|
GuiText btn1Txt(LANGUAGE.Cancel, 22, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
|
||||||
|
GuiImage btn1Img(&btnOutline);
|
||||||
|
if (Settings.wsprompt == yes){
|
||||||
|
btn1Txt.SetWidescreen(CFG.widescreen);
|
||||||
|
btn1Img.SetWidescreen(CFG.widescreen);}
|
||||||
|
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
|
||||||
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
||||||
|
btn1.SetPosition(0, -40);
|
||||||
|
btn1.SetLabel(&btn1Txt);
|
||||||
|
btn1.SetImage(&btn1Img);
|
||||||
|
btn1.SetSoundOver(&btnSoundOver);
|
||||||
|
btn1.SetSoundClick(&btnClick);
|
||||||
|
btn1.SetTrigger(&trigA);
|
||||||
|
btn1.SetState(STATE_SELECTED);
|
||||||
|
btn1.SetEffectGrow();
|
||||||
|
|
||||||
|
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
|
||||||
|
progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||||||
|
progressbarOutlineImg.SetPosition(0, 7);
|
||||||
|
progressbarEmptyImg.SetPosition(80,7);
|
||||||
|
progressbarEmptyImg.SetTile(78);
|
||||||
|
progressbarImg.SetPosition(80, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
promptWindow.Append(&dialogBoxImg);
|
||||||
|
promptWindow.Append(&titleTxt);
|
||||||
|
promptWindow.Append(&msgTxt);
|
||||||
|
promptWindow.Append(&msg2Txt);
|
||||||
|
promptWindow.Append(&btn1);
|
||||||
|
|
||||||
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
||||||
|
|
||||||
|
HaltGui();
|
||||||
|
mainWindow->SetState(STATE_DISABLED);
|
||||||
|
mainWindow->Append(&promptWindow);
|
||||||
|
mainWindow->ChangeFocus(&promptWindow);
|
||||||
|
ResumeGui();
|
||||||
|
|
||||||
|
struct stat st;
|
||||||
|
if(stat(CFG.update_path, &st) != 0) {
|
||||||
|
char dir[100];
|
||||||
|
snprintf(dir,strlen(CFG.update_path),"%s",CFG.update_path);
|
||||||
|
if (mkdir(dir, 0777) == -1) {
|
||||||
|
if(subfoldercheck(dir) != 1) {
|
||||||
|
WindowPrompt(LANGUAGE.Error,LANGUAGE.Cantcreatedirectory,LANGUAGE.ok,0,0,0);
|
||||||
|
ret = -1;
|
||||||
|
failed = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char dolpath[150];
|
||||||
|
char dolpathsuccess[150];
|
||||||
|
snprintf(dolpath, sizeof(dolpath), "%sbootnew.dol", CFG.update_path);
|
||||||
|
snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sboot.dol", CFG.update_path);
|
||||||
|
|
||||||
|
while (!IP && !(ret < 0)) {
|
||||||
|
|
||||||
|
VIDEO_WaitVSync();
|
||||||
|
|
||||||
|
ret = Net_Init(hostip);
|
||||||
|
|
||||||
|
if (ret > 0) {
|
||||||
|
IP = hostip;
|
||||||
|
msgTxt.SetText(IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret <= 0) {
|
||||||
|
msgTxt.SetText(LANGUAGE.Couldnotinitializenetwork);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(btn1.GetState() == STATE_CLICKED) {
|
||||||
|
IP = 0;
|
||||||
|
ret = -1;
|
||||||
|
failed = -1;
|
||||||
|
btn1.ResetState();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(IP && ret >= 0) {
|
||||||
|
|
||||||
|
networkisinitialized = 1;
|
||||||
|
|
||||||
|
int revnumber = 0;
|
||||||
|
int currentrev = atoi(SVN_REV);
|
||||||
|
|
||||||
|
SDCard_deInit();
|
||||||
|
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/rev.txt");
|
||||||
|
FILE *pfile;
|
||||||
|
SDCard_Init();
|
||||||
|
|
||||||
|
if(file.data != NULL)
|
||||||
|
{
|
||||||
|
char revtxt[10];
|
||||||
|
pfile = fopen("SD:/rev.txt", "w");
|
||||||
|
fwrite(file.data,1,file.size,pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
//has to be repeated or it isnt working (first file download bug)
|
||||||
|
pfile = fopen("SD:/rev.txt", "w");
|
||||||
|
fwrite(file.data,1,file.size,pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
//"w+" doesnt work, needs to be reopened as "r"
|
||||||
|
pfile = fopen("SD:/rev.txt", "r");
|
||||||
|
int c = 0, i = 0;
|
||||||
|
while(c != EOF || i < 10) {
|
||||||
|
c = fgetc(pfile);
|
||||||
|
if (c != EOF) {
|
||||||
|
revtxt[i] = c;
|
||||||
|
} else {
|
||||||
|
revtxt[i] = 0x00;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
fclose(pfile);
|
||||||
|
revnumber = atoi(revtxt);
|
||||||
|
remove("SD:/rev.txt");
|
||||||
|
free(file.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(revnumber > currentrev) {
|
||||||
|
sprintf(msg, "Rev%i available.", revnumber);
|
||||||
|
int choice = WindowPrompt(msg, "Do you want to update?", LANGUAGE.Yes, LANGUAGE.No, 0, 0);
|
||||||
|
if(choice == 1) {
|
||||||
|
sprintf(title, "%s", "Updating USB Loader GX");
|
||||||
|
titleTxt.SetText(title);
|
||||||
|
msgTxt.SetPosition(0,100);
|
||||||
|
promptWindow.Append(&progressbarEmptyImg);
|
||||||
|
promptWindow.Append(&progressbarImg);
|
||||||
|
promptWindow.Append(&progressbarOutlineImg);
|
||||||
|
promptWindow.Append(&prTxt);
|
||||||
|
sprintf(msg, "Updating to Rev%i", revnumber);
|
||||||
|
msgTxt.SetText(msg);
|
||||||
|
int filesize = downloadrev("http://www.techjawa.com/usbloadergx/boot.dol");
|
||||||
|
if(filesize > 0) {
|
||||||
|
pfile = fopen(dolpath, "wb");
|
||||||
|
for (int i = 0; i < filesize; i += blocksize) {
|
||||||
|
sprintf(prozent, "%i%%", 100*i/filesize);
|
||||||
|
prTxt.SetText(prozent);
|
||||||
|
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
|
||||||
|
progressbarImg.SetTile(80*i/filesize);
|
||||||
|
} else {
|
||||||
|
progressbarImg.SetTile(100*i/filesize);
|
||||||
|
}
|
||||||
|
sprintf(msg2, "%iKB/%iKB", i/1024, filesize/1024);
|
||||||
|
msg2Txt.SetText(msg2);
|
||||||
|
|
||||||
|
if(btn1.GetState() == STATE_CLICKED) {
|
||||||
|
fclose(pfile);
|
||||||
|
remove(dolpath);
|
||||||
|
failed = -1;
|
||||||
|
btn1.ResetState();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 blksize;
|
||||||
|
blksize = (u32)(filesize - i);
|
||||||
|
if (blksize > blocksize)
|
||||||
|
blksize = blocksize;
|
||||||
|
|
||||||
|
ret = network_read(blockbuffer, blksize);
|
||||||
|
if ((u32)ret != blksize) {
|
||||||
|
failed = -1;
|
||||||
|
ret = -1;
|
||||||
|
fclose(pfile);
|
||||||
|
remove(dolpath);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fwrite(blockbuffer,1,blksize, pfile);
|
||||||
|
}
|
||||||
|
fclose(pfile);
|
||||||
|
if(!failed) {
|
||||||
|
//remove old
|
||||||
|
if(checkfile(dolpathsuccess)){
|
||||||
|
remove(dolpathsuccess);
|
||||||
|
}
|
||||||
|
//rename new to old
|
||||||
|
rename(dolpath, dolpathsuccess);
|
||||||
|
|
||||||
|
//get the icon.png and the meta.xml
|
||||||
|
char xmliconpath[150];
|
||||||
|
file = downloadfile("http://www.techjawa.com/usbloadergx/meta.file");
|
||||||
|
if(file.data != NULL){
|
||||||
|
sprintf(xmliconpath, "%smeta.xml", CFG.update_path);
|
||||||
|
pfile = fopen(xmliconpath, "wb");
|
||||||
|
fwrite(file.data,1,file.size,pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
free(file.data);
|
||||||
|
}
|
||||||
|
file = downloadfile("http://www.techjawa.com/usbloadergx/icon.png");
|
||||||
|
if(file.data != NULL){
|
||||||
|
sprintf(xmliconpath, "%sicon.png", CFG.update_path);
|
||||||
|
pfile = fopen(xmliconpath, "wb");
|
||||||
|
fwrite(file.data,1,file.size,pfile);
|
||||||
|
fclose(pfile);
|
||||||
|
free(file.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
failed = -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
WindowPrompt("No new updates", 0, "OK", 0, 0, 0);
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseConnection();
|
||||||
|
|
||||||
|
if(!failed && ret >= 0) {
|
||||||
|
WindowPrompt("Successfully updated ", "Restarting the Loader", "OK", 0, 0, 0);
|
||||||
|
if (*((u32*) 0x80001800)) exit(0);
|
||||||
|
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
||||||
|
while(promptWindow.GetEffect() > 0) usleep(50);
|
||||||
|
|
||||||
|
HaltGui();
|
||||||
|
mainWindow->Remove(&promptWindow);
|
||||||
|
mainWindow->SetState(STATE_DEFAULT);
|
||||||
|
ResumeGui();
|
||||||
|
|
||||||
|
if(failed != 0)
|
||||||
|
return failed;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* UpdateGUI
|
* UpdateGUI
|
||||||
@ -4140,7 +4450,6 @@ static int MenuSettings()
|
|||||||
|
|
||||||
char imgPath[100];
|
char imgPath[100];
|
||||||
|
|
||||||
|
|
||||||
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
|
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
|
||||||
GuiImageData btnOutline(imgPath, button_dialogue_box_png);
|
GuiImageData btnOutline(imgPath, button_dialogue_box_png);
|
||||||
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
|
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
|
||||||
@ -4151,6 +4460,8 @@ static int MenuSettings()
|
|||||||
GuiImageData tab2(imgPath, tab_bg2_png);
|
GuiImageData tab2(imgPath, tab_bg2_png);
|
||||||
snprintf(imgPath, sizeof(imgPath), "%stab_bg3.png", CFG.theme_path);
|
snprintf(imgPath, sizeof(imgPath), "%stab_bg3.png", CFG.theme_path);
|
||||||
GuiImageData tab3(imgPath, tab_bg3_png);
|
GuiImageData tab3(imgPath, tab_bg3_png);
|
||||||
|
snprintf(imgPath, sizeof(imgPath), "%supdateRev.png", CFG.theme_path);
|
||||||
|
GuiImageData updateRevImgData(imgPath, updateRev_png);
|
||||||
|
|
||||||
GuiTrigger trigA;
|
GuiTrigger trigA;
|
||||||
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
||||||
@ -4249,6 +4560,19 @@ static int MenuSettings()
|
|||||||
lockBtn.SetTrigger(&trigA);
|
lockBtn.SetTrigger(&trigA);
|
||||||
lockBtn.SetEffectGrow();
|
lockBtn.SetEffectGrow();
|
||||||
|
|
||||||
|
GuiImage updateBtnImg(&updateRevImgData);
|
||||||
|
updateBtnImg.SetWidescreen(CFG.widescreen);
|
||||||
|
GuiButton updateBtn(updateBtnImg.GetWidth(), updateBtnImg.GetHeight());
|
||||||
|
updateBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
||||||
|
updateBtn.SetPosition(70, 400);
|
||||||
|
updateBtn.SetImage(&updateBtnImg);
|
||||||
|
updateBtn.SetSoundOver(&btnSoundOver);
|
||||||
|
updateBtn.SetSoundClick(&btnClick);
|
||||||
|
updateBtn.SetTrigger(&trigA);
|
||||||
|
updateBtn.SetVisible(false);
|
||||||
|
updateBtn.SetClickable(false);
|
||||||
|
updateBtn.SetEffectGrow();
|
||||||
|
|
||||||
GuiImageData logo(credits_button_png);
|
GuiImageData logo(credits_button_png);
|
||||||
GuiImage logoImg(&logo);
|
GuiImage logoImg(&logo);
|
||||||
GuiImageData logoOver(credits_button_over_png);
|
GuiImageData logoOver(credits_button_over_png);
|
||||||
@ -4295,6 +4619,7 @@ static int MenuSettings()
|
|||||||
w.Append(&titleTxt);
|
w.Append(&titleTxt);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
w.Append(btnLogo);
|
w.Append(btnLogo);
|
||||||
w.Append(&homo);
|
w.Append(&homo);
|
||||||
//set triggers for tabs
|
//set triggers for tabs
|
||||||
@ -4372,7 +4697,7 @@ static int MenuSettings()
|
|||||||
sprintf(options2.name[3], "%s",LANGUAGE.Unicodefix);
|
sprintf(options2.name[3], "%s",LANGUAGE.Unicodefix);
|
||||||
sprintf(options2.name[4], "%s",LANGUAGE.Backgroundmusic);
|
sprintf(options2.name[4], "%s",LANGUAGE.Backgroundmusic);
|
||||||
sprintf(options2.name[5], "%s",LANGUAGE.Wiilight);
|
sprintf(options2.name[5], "%s",LANGUAGE.Wiilight);
|
||||||
sprintf(options2.name[6], " ");
|
sprintf(options2.name[6], "%s",LANGUAGE.Updatepath);
|
||||||
sprintf(options2.name[7], "%s",LANGUAGE.MP3Menu);
|
sprintf(options2.name[7], "%s",LANGUAGE.MP3Menu);
|
||||||
sprintf(options2.name[8], "%s",LANGUAGE.Defaultsettings);
|
sprintf(options2.name[8], "%s",LANGUAGE.Defaultsettings);
|
||||||
|
|
||||||
@ -4572,6 +4897,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[20] = "";
|
char entered[20] = "";
|
||||||
strncpy(entered, Settings.unlockCode, sizeof(entered));
|
strncpy(entered, Settings.unlockCode, sizeof(entered));
|
||||||
int result = OnScreenKeyboard(entered, 20,0);
|
int result = OnScreenKeyboard(entered, 20,0);
|
||||||
@ -4582,6 +4908,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
if ( result == 1 )
|
if ( result == 1 )
|
||||||
{
|
{
|
||||||
strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode));
|
strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode));
|
||||||
@ -4620,6 +4947,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[43] = "";
|
char entered[43] = "";
|
||||||
strncpy(entered, CFG.covers_path, sizeof(entered));
|
strncpy(entered, CFG.covers_path, sizeof(entered));
|
||||||
int result = OnScreenKeyboard(entered,43,4);
|
int result = OnScreenKeyboard(entered,43,4);
|
||||||
@ -4630,6 +4958,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
if ( result == 1 )
|
if ( result == 1 )
|
||||||
{
|
{
|
||||||
int len = (strlen(entered)-1);
|
int len = (strlen(entered)-1);
|
||||||
@ -4657,6 +4986,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[43] = "";
|
char entered[43] = "";
|
||||||
strncpy(entered, CFG.disc_path, sizeof(entered));
|
strncpy(entered, CFG.disc_path, sizeof(entered));
|
||||||
int result = OnScreenKeyboard(entered, 43,4);
|
int result = OnScreenKeyboard(entered, 43,4);
|
||||||
@ -4667,6 +4997,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
if ( result == 1 )
|
if ( result == 1 )
|
||||||
{
|
{
|
||||||
int len = (strlen(entered)-1);
|
int len = (strlen(entered)-1);
|
||||||
@ -4694,6 +5025,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[43] = "";
|
char entered[43] = "";
|
||||||
strncpy(entered, CFG.theme_path, sizeof(entered));
|
strncpy(entered, CFG.theme_path, sizeof(entered));
|
||||||
int result = OnScreenKeyboard(entered, 43,4);
|
int result = OnScreenKeyboard(entered, 43,4);
|
||||||
@ -4704,6 +5036,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
if ( result == 1 )
|
if ( result == 1 )
|
||||||
{
|
{
|
||||||
int len = (strlen(entered)-1);
|
int len = (strlen(entered)-1);
|
||||||
@ -4745,6 +5078,7 @@ static int MenuSettings()
|
|||||||
w.Append(&titleTxt);
|
w.Append(&titleTxt);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
w.Append(btnLogo);
|
w.Append(btnLogo);
|
||||||
|
|
||||||
mainWindow->Append(&optionBrowser2);
|
mainWindow->Append(&optionBrowser2);
|
||||||
@ -4754,6 +5088,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -4818,7 +5153,15 @@ static int MenuSettings()
|
|||||||
else if (Settings.wiilight == 1) sprintf (options2.value[5],"%s",LANGUAGE.ON);
|
else if (Settings.wiilight == 1) sprintf (options2.value[5],"%s",LANGUAGE.ON);
|
||||||
else if (Settings.wiilight == 2) sprintf (options2.value[5],"%s",LANGUAGE.OnlyInstall);
|
else if (Settings.wiilight == 2) sprintf (options2.value[5],"%s",LANGUAGE.OnlyInstall);
|
||||||
|
|
||||||
sprintf(options2.value[6], " ");
|
if (strlen(CFG.update_path) < (9 + 3)) {
|
||||||
|
sprintf(cfgtext, "%s", CFG.update_path);
|
||||||
|
} else {
|
||||||
|
strncpy(cfgtext, CFG.update_path, 9);
|
||||||
|
cfgtext[9] = '\0';
|
||||||
|
strncat(cfgtext, "...", 3);
|
||||||
|
}
|
||||||
|
sprintf(options2.value[6], "%s", cfgtext);
|
||||||
|
|
||||||
sprintf(options2.value[7], "not working!");
|
sprintf(options2.value[7], "not working!");
|
||||||
sprintf(options2.value[8], " ");
|
sprintf(options2.value[8], " ");
|
||||||
|
|
||||||
@ -4836,6 +5179,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[43] = "";
|
char entered[43] = "";
|
||||||
strncpy(entered, CFG.titlestxt_path, sizeof(entered));
|
strncpy(entered, CFG.titlestxt_path, sizeof(entered));
|
||||||
int result = OnScreenKeyboard(entered,43,4);
|
int result = OnScreenKeyboard(entered,43,4);
|
||||||
@ -4846,6 +5190,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
if ( result == 1 )
|
if ( result == 1 )
|
||||||
{
|
{
|
||||||
int len = (strlen(entered)-1);
|
int len = (strlen(entered)-1);
|
||||||
@ -4876,6 +5221,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[40] = "";
|
char entered[40] = "";
|
||||||
strncpy(entered, CFG.language_path, sizeof(entered));
|
strncpy(entered, CFG.language_path, sizeof(entered));
|
||||||
int result = OnScreenKeyboard(entered, 40,0);
|
int result = OnScreenKeyboard(entered, 40,0);
|
||||||
@ -4886,6 +5232,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
if ( result == 1 )
|
if ( result == 1 )
|
||||||
{ strncpy(CFG.language_path, entered, sizeof(CFG.language_path));
|
{ strncpy(CFG.language_path, entered, sizeof(CFG.language_path));
|
||||||
if(isSdInserted()) {
|
if(isSdInserted()) {
|
||||||
@ -4932,6 +5279,40 @@ static int MenuSettings()
|
|||||||
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
|
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 6:
|
||||||
|
if ( CFG.godmode == 1)
|
||||||
|
{
|
||||||
|
mainWindow->Remove(&optionBrowser2);
|
||||||
|
mainWindow->Remove(&page1Btn);
|
||||||
|
mainWindow->Remove(&page2Btn);
|
||||||
|
mainWindow->Remove(&tabBtn);
|
||||||
|
mainWindow->Remove(&page3Btn);
|
||||||
|
w.Remove(&backBtn);
|
||||||
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
|
char entered[43] = "";
|
||||||
|
strncpy(entered, CFG.update_path, sizeof(entered));
|
||||||
|
int result = OnScreenKeyboard(entered,43,4);
|
||||||
|
mainWindow->Append(&optionBrowser2);
|
||||||
|
mainWindow->Append(&page1Btn);
|
||||||
|
mainWindow->Append(&page2Btn);
|
||||||
|
mainWindow->Append(&tabBtn);
|
||||||
|
mainWindow->Append(&page3Btn);
|
||||||
|
w.Append(&backBtn);
|
||||||
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
|
if ( result == 1 )
|
||||||
|
{
|
||||||
|
int len = (strlen(entered)-1);
|
||||||
|
if(entered[len] !='/')
|
||||||
|
strncat (entered, "/", 1);
|
||||||
|
strncpy(CFG.update_path, entered, sizeof(CFG.update_path));
|
||||||
|
WindowPrompt(LANGUAGE.Updatepathchanged,0,LANGUAGE.ok,0,0,0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
WindowPrompt(0,LANGUAGE.Consoleshouldbeunlockedtomodifyit,LANGUAGE.ok,0,0,0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
int choice = WindowPrompt(LANGUAGE.Areyousure, 0, LANGUAGE.Yes, LANGUAGE.Cancel, 0, 0);
|
int choice = WindowPrompt(LANGUAGE.Areyousure, 0, LANGUAGE.Yes, LANGUAGE.Cancel, 0, 0);
|
||||||
if(choice == 1) {
|
if(choice == 1) {
|
||||||
@ -4992,6 +5373,34 @@ static int MenuSettings()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(updateBtn.GetState() == STATE_CLICKED) {
|
||||||
|
if(isSdInserted() && CFG.godmode) {
|
||||||
|
mainWindow->Remove(&optionBrowser2);
|
||||||
|
mainWindow->Remove(&page1Btn);
|
||||||
|
mainWindow->Remove(&page2Btn);
|
||||||
|
mainWindow->Remove(&tabBtn);
|
||||||
|
mainWindow->Remove(&page3Btn);
|
||||||
|
w.Remove(&backBtn);
|
||||||
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
|
int ret = ProgressUpdateWindow();
|
||||||
|
if(ret < 0) {
|
||||||
|
WindowPrompt(LANGUAGE.Updatefailed,0,LANGUAGE.ok,0,0,0);
|
||||||
|
}
|
||||||
|
mainWindow->Append(&optionBrowser2);
|
||||||
|
mainWindow->Append(&page1Btn);
|
||||||
|
mainWindow->Append(&page2Btn);
|
||||||
|
mainWindow->Append(&tabBtn);
|
||||||
|
mainWindow->Append(&page3Btn);
|
||||||
|
w.Append(&backBtn);
|
||||||
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
|
} else {
|
||||||
|
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
|
||||||
|
}
|
||||||
|
updateBtn.ResetState();
|
||||||
|
}
|
||||||
|
|
||||||
if(lockBtn.GetState() == STATE_CLICKED)
|
if(lockBtn.GetState() == STATE_CLICKED)
|
||||||
{
|
{
|
||||||
if (!strcmp("", Settings.unlockCode))
|
if (!strcmp("", Settings.unlockCode))
|
||||||
@ -5008,6 +5417,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Remove(&page3Btn);
|
mainWindow->Remove(&page3Btn);
|
||||||
w.Remove(&backBtn);
|
w.Remove(&backBtn);
|
||||||
w.Remove(&lockBtn);
|
w.Remove(&lockBtn);
|
||||||
|
w.Remove(&updateBtn);
|
||||||
char entered[20] = "";
|
char entered[20] = "";
|
||||||
int result = OnScreenKeyboard(entered, 20,0);
|
int result = OnScreenKeyboard(entered, 20,0);
|
||||||
mainWindow->Append(&optionBrowser2);
|
mainWindow->Append(&optionBrowser2);
|
||||||
@ -5017,6 +5427,7 @@ static int MenuSettings()
|
|||||||
mainWindow->Append(&page3Btn);
|
mainWindow->Append(&page3Btn);
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
w.Append(&lockBtn);
|
w.Append(&lockBtn);
|
||||||
|
w.Append(&updateBtn);
|
||||||
mainWindow->Append(&tabBtn);
|
mainWindow->Append(&tabBtn);
|
||||||
if ( result == 1 ) {
|
if ( result == 1 ) {
|
||||||
if (!strcmp(entered, Settings.unlockCode)) //if password correct
|
if (!strcmp(entered, Settings.unlockCode)) //if password correct
|
||||||
@ -5087,6 +5498,13 @@ static int MenuSettings()
|
|||||||
homo.ResetState();
|
homo.ResetState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(CFG.godmode) {
|
||||||
|
updateBtn.SetVisible(true);
|
||||||
|
updateBtn.SetClickable(true);
|
||||||
|
} else {
|
||||||
|
updateBtn.SetVisible(false);
|
||||||
|
updateBtn.SetClickable(false);
|
||||||
|
}
|
||||||
if(settingsbackgroundbtn.GetState() == STATE_CLICKED)
|
if(settingsbackgroundbtn.GetState() == STATE_CLICKED)
|
||||||
{
|
{
|
||||||
optionBrowser2.SetFocus(1);
|
optionBrowser2.SetFocus(1);
|
||||||
|
116
source/updater.c
Normal file
116
source/updater.c
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ogcsys.h>
|
||||||
|
#include <network.h>
|
||||||
|
|
||||||
|
#include "http.h"
|
||||||
|
|
||||||
|
static s32 connection;
|
||||||
|
|
||||||
|
s32 network_request(const char * request)
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
char *ptr = NULL;
|
||||||
|
|
||||||
|
u32 cnt, size;
|
||||||
|
s32 ret;
|
||||||
|
|
||||||
|
/* Send request */
|
||||||
|
ret = net_send(connection, request, strlen(request), 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Clear buffer */
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
|
||||||
|
/* Read HTTP header */
|
||||||
|
for (cnt = 0; !strstr(buf, "\r\n\r\n"); cnt++)
|
||||||
|
if (net_recv(connection, buf + cnt, 1, 0) <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* HTTP request OK? */
|
||||||
|
if (!strstr(buf, "HTTP/1.1 200 OK"))
|
||||||
|
return -1;
|
||||||
|
/* Retrieve content size */
|
||||||
|
ptr = strstr(buf, "Content-Length:");
|
||||||
|
if (!ptr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
sscanf(ptr, "Content-Length: %u", &size);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 network_read(void *buf, u32 len)
|
||||||
|
{
|
||||||
|
s32 read = 0, ret;
|
||||||
|
|
||||||
|
/* Data to be read */
|
||||||
|
while (read < len) {
|
||||||
|
/* Read network data */
|
||||||
|
ret = net_read(connection, buf + read, len - read);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Read finished */
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Increment read variable */
|
||||||
|
read += ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 downloadrev(const char * url) {
|
||||||
|
|
||||||
|
//Check if the url starts with "http://", if not it is not considered a valid url
|
||||||
|
if(strncmp(url, "http://", strlen("http://")) != 0)
|
||||||
|
{
|
||||||
|
//printf("URL '%s' doesn't start with 'http://'\n", url);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Locate the path part of the url by searching for '/' past "http://"
|
||||||
|
char *path = strchr(url + strlen("http://"), '/');
|
||||||
|
|
||||||
|
//At the very least the url has to end with '/', ending with just a domain is invalid
|
||||||
|
if(path == NULL)
|
||||||
|
{
|
||||||
|
//printf("URL '%s' has no PATH part\n", url);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Extract the domain part out of the url
|
||||||
|
int domainlength = path - url - strlen("http://");
|
||||||
|
|
||||||
|
if(domainlength == 0)
|
||||||
|
{
|
||||||
|
//printf("No domain part in URL '%s'\n", url);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char domain[domainlength + 1];
|
||||||
|
strncpy(domain, url + strlen("http://"), domainlength);
|
||||||
|
domain[domainlength] = '\0';
|
||||||
|
|
||||||
|
connection = GetConnection(domain);
|
||||||
|
if(connection < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Form a nice request header to send to the webserver
|
||||||
|
char* headerformat = "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n";;
|
||||||
|
char header[strlen(headerformat) + strlen(domain) + strlen(path)];
|
||||||
|
sprintf(header, headerformat, path, domain);
|
||||||
|
|
||||||
|
s32 filesize = network_request(header);
|
||||||
|
|
||||||
|
return filesize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloseConnection() {
|
||||||
|
|
||||||
|
net_close(connection);
|
||||||
|
|
||||||
|
}
|
18
source/updater.h
Normal file
18
source/updater.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef _UPDATER_H_
|
||||||
|
#define _UPDATER_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s32 network_request(const char * request);
|
||||||
|
s32 network_read(void *buf, u32 len);
|
||||||
|
s32 downloadrev(const char * url);
|
||||||
|
void CloseConnection();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user