(PS3) Added oskutil.c

This commit is contained in:
TwinAphex51224 2012-02-29 20:19:58 +01:00
parent 90984ce3cc
commit 9a1cf7525e
3 changed files with 258 additions and 0 deletions

View File

@ -45,6 +45,7 @@ PPU_SRCS = fifo_buffer.c \
console/rom_ext.c \
ps3/ps3_input.c \
ps3/cellframework2/input/pad_input.c \
ps3/cellframework2/utility/oskutil.c \
getopt.c \
ssnes.c \
driver.c \

View File

@ -0,0 +1,171 @@
/* -- Cellframework Mk.II - Open framework to abstract the common tasks related to
* PS3 application development.
*
* Copyright (C) 2010-2012
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes.
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
* Copyright (C) 2011-2012 - Daniel De Matteis
*
* Some code herein may be based on code found in BSNES.
*
* SSNES is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with SSNES.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "sysutil/sysutil_oskdialog.h"
#include "sys/memory.h"
#include "oskutil.h"
#define OSK_IN_USE (0x00000001)
void oskutil_init(oskutil_params *params, unsigned int containersize)
{
params->flags = 0;
params->is_running = false;
if(containersize)
params->osk_memorycontainer = containersize;
else
params->osk_memorycontainer = 1024*1024*7;
}
static bool oskutil_enable_key_layout()
{
int ret = cellOskDialogSetKeyLayoutOption(CELL_OSKDIALOG_10KEY_PANEL | \
CELL_OSKDIALOG_FULLKEY_PANEL);
if (ret < 0)
return (false);
else
return (true);
}
static void oskutil_create_activation_parameters(oskutil_params *params)
{
// Initial display psition of the OSK (On-Screen Keyboard) dialog [x, y]
params->dialogParam.controlPoint.x = 0.0;
params->dialogParam.controlPoint.y = 0.0;
// Set standard position
int32_t LayoutMode = CELL_OSKDIALOG_LAYOUTMODE_X_ALIGN_CENTER | CELL_OSKDIALOG_LAYOUTMODE_Y_ALIGN_TOP;
cellOskDialogSetLayoutMode(LayoutMode);
//Select panels to be used using flags
// NOTE: We don't need CELL_OSKDIALOG_PANELMODE_JAPANESE_KATAKANA and \
// CELL_OSKDIALOG_PANELMODE_JAPANESE obviously (and Korean), so I'm \
// going to leave that all out
params->dialogParam.allowOskPanelFlg =
CELL_OSKDIALOG_PANELMODE_ALPHABET |
CELL_OSKDIALOG_PANELMODE_NUMERAL |
CELL_OSKDIALOG_PANELMODE_NUMERAL_FULL_WIDTH |
CELL_OSKDIALOG_PANELMODE_ENGLISH;
params->dialogParam.firstViewPanel = CELL_OSKDIALOG_PANELMODE_ENGLISH;
params->dialogParam.prohibitFlgs = 0;
}
void oskutil_write_message(oskutil_params *params, const wchar_t* msg)
{
params->inputFieldInfo.message = (uint16_t*)msg;
}
void oskutil_write_initial_message(oskutil_params *params, const wchar_t* msg)
{
params->inputFieldInfo.init_text = (uint16_t*)msg;
}
bool oskutil_start(oskutil_params *params)
{
memset(params->osk_text_buffer, 0, sizeof(*params->osk_text_buffer));
memset(params->osk_text_buffer_char, 0, 256);
//reset text output state before beginning new session
params->text_can_be_fetched = false;
if (params->flags & OSK_IN_USE)
return (true);
int ret = sys_memory_container_create(&params->containerid, params->osk_memorycontainer);
if(ret < 0)
return (false);
//Length limitation for input text
params->inputFieldInfo.limit_length = CELL_OSKDIALOG_STRING_SIZE;
oskutil_create_activation_parameters(params);
if(!oskutil_enable_key_layout())
return (false);
ret = cellOskDialogLoadAsync(params->containerid, &params->dialogParam, &params->inputFieldInfo);
if(ret < 0)
return (false);
params->flags |= OSK_IN_USE;
params->is_running = true;
return (true);
}
void oskutil_close(oskutil_params *params)
{
cellOskDialogAbort();
}
void oskutil_finished(oskutil_params *params)
{
params->outputInfo.result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK; // Result onscreen keyboard dialog termination
params->outputInfo.numCharsResultString = 256; // Specify number of characters for returned text
params->outputInfo.pResultString = (uint16_t *)params->osk_text_buffer; // Buffer storing returned text
cellOskDialogUnloadAsync(&params->outputInfo);
int num;
switch (params->outputInfo.result)
{
case CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK:
//The text we get from the outputInfo is Unicode, needs to be converted
num = wcstombs(params->osk_text_buffer_char, params->osk_text_buffer, 256);
params->osk_text_buffer_char[num]=0;
params->text_can_be_fetched = true;
break;
case CELL_OSKDIALOG_INPUT_FIELD_RESULT_CANCELED:
case CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT:
case CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT:
default:
params->osk_text_buffer_char[0]=0;
params->text_can_be_fetched = false;
break;
}
params->flags &= ~OSK_IN_USE;
}
void oskutil_unload(oskutil_params *params)
{
sys_memory_container_destroy(params->containerid);
params->is_running = false;
}

View File

@ -0,0 +1,86 @@
/* -- Cellframework Mk.II - Open framework to abstract the common tasks related to
* PS3 application development.
*
* Copyright (C) 2010-2012
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes.
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
* Copyright (C) 2011-2012 - Daniel De Matteis
*
* Some code herein may be based on code found in BSNES.
*
* SSNES is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with SSNES.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __OSKUTIL_H__
#define __OSKUTIL_H__
#include <sysutil/sysutil_oskdialog.h>
#include <sysutil/sysutil_common.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#define OSK_IS_RUNNING(object) object.is_running
#define OUTPUT_TEXT_STRING(object) object.osk_text_buffer_char
typedef struct
{
unsigned int osk_memorycontainer;
wchar_t init_message[CELL_OSKDIALOG_STRING_SIZE + 1]; // buffer
wchar_t message[CELL_OSKDIALOG_STRING_SIZE + 1]; //buffer
wchar_t osk_text_buffer[CELL_OSKDIALOG_STRING_SIZE + 1];
char osk_text_buffer_char[CELL_OSKDIALOG_STRING_SIZE + 1];
uint32_t flags;
bool is_running;
bool text_can_be_fetched;
sys_memory_container_t containerid;
CellOskDialogPoint pos;
CellOskDialogInputFieldInfo inputFieldInfo;
CellOskDialogCallbackReturnParam outputInfo;
CellOskDialogParam dialogParam;
} oskutil_params;
#ifdef __cplusplus
extern "C" {
#endif
void oskutil_write_message(oskutil_params *params, const wchar_t* msg);
void oskutil_write_initial_message(oskutil_params *params, const wchar_t* msg);
void oskutil_init(oskutil_params *params, unsigned int containersize);
bool oskutil_start(oskutil_params *params);
void oskutil_stop(oskutil_params *params);
void oskutil_finished(oskutil_params *params);
void oskutil_close(oskutil_params *params);
void oskutil_unload(oskutil_params *params);
#ifdef __cplusplus
}
#endif
#endif