diff --git a/Makefile.ps3 b/Makefile.ps3 index 1bca54d026..9256216e75 100644 --- a/Makefile.ps3 +++ b/Makefile.ps3 @@ -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 \ diff --git a/ps3/cellframework2/utility/oskutil.c b/ps3/cellframework2/utility/oskutil.c new file mode 100644 index 0000000000..8e034d5739 --- /dev/null +++ b/ps3/cellframework2/utility/oskutil.c @@ -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 . + */ + +#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(¶ms->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, ¶ms->dialogParam, ¶ms->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(¶ms->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; +} diff --git a/ps3/cellframework2/utility/oskutil.h b/ps3/cellframework2/utility/oskutil.h new file mode 100644 index 0000000000..17a8cb769c --- /dev/null +++ b/ps3/cellframework2/utility/oskutil.h @@ -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 . + */ + +#ifndef __OSKUTIL_H__ +#define __OSKUTIL_H__ + +#include +#include +#include +#include +#include + +#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