Skip to content

Commit

Permalink
Vita: touch keyboard in menu, remove translations, smoother pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
rsn8887 committed Mar 22, 2018
1 parent 72c97d4 commit 7ab4b07
Show file tree
Hide file tree
Showing 9 changed files with 214 additions and 33 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Expand Up @@ -27,6 +27,7 @@ set(SRC_FILES
src/psp2/psp2-dirent.c
src/psp2/psp2_touch.c
src/psp2/psp2_input.c
src/psp2/psp2_kbdvita.c
src/AttributeDescriptor.cc
src/DOMErrorReporter.cc
src/DOMSchemaResolver.cc
Expand Down Expand Up @@ -369,7 +370,7 @@ set(LDFLAGS
vita2d
xerces-c
curl
SceSysmodule_stub SceDisplay_stub SceGxm_stub
SceSysmodule_stub SceDisplay_stub SceGxm_stub SceAppUtil_stub
SceCtrl_stub ScePgf_stub ScePower_stub SceCommonDialog_stub
SceAudio_stub SceShellSvc_stub
SceHid_stub
Expand Down
20 changes: 0 additions & 20 deletions lib-src/enigma-core/ecl_video.cc
Expand Up @@ -30,11 +30,6 @@
#include <memory>
#include <cstdio>

#ifdef __vita__
#include <iostream>
#include <fstream>
#endif

using namespace ecl;

/* -------------------- Graphics primitives -------------------- */
Expand Down Expand Up @@ -406,22 +401,7 @@ Surface *ecl::DisplayFormat(Surface *s) {
}

ecl::Screen *ecl::OpenScreen(int w, int h, int bipp) {
#ifdef __vita__
SDL_Surface *sfc = SDL_SetVideoMode(w, h, bipp, SDL_HWSURFACE|SDL_DOUBLEBUF);
float sh = (float) 544;
float sw = (float)w*((float)544/(float)h);
int x = (960-sw)/2;
int y = (544-sh)/2;

SDL_SetVideoModeScaling(x, y, sw, sh);

//This requires a recent SDL-Vita branch SDL12 for example
//https://github.com/rsn8887/SDL-Vita/tree/SDL12
//to compile
SDL_SetVideoModeBilinear(1);
#else
SDL_Surface *sfc = SDL_SetVideoMode(w, h, bipp, SDL_SWSURFACE);
#endif
return new Screen(sfc);
}

Expand Down
2 changes: 0 additions & 2 deletions src/gui/MainMenu.cc
Expand Up @@ -546,8 +546,6 @@ namespace enigma { namespace gui {
void MainMenu::tick(double /* dtime */)
{
#ifdef __vita__
// display::RedrawAll(video::GetScreen());
// SDL_Flip(video::GetScreen()->get_surface()->get_surface());
return;
#else
bool isFullScreen = app.prefs->getBool("FullScreen");
Expand Down
7 changes: 3 additions & 4 deletions src/gui/Menu.cc
Expand Up @@ -100,12 +100,11 @@ namespace enigma { namespace gui {
if(key_focus_widget && (key_focus_widget != active_widget)) key_focus_widget->tick(0.01);
tick(0.01);
#ifdef __vita__
static double totalTime = 0;
totalTime += 10;
if (totalTime > 16) {
totalTime = 0;
static Uint32 last_menu_draw_time = 0;
if (SDL_GetTicks() - last_menu_draw_time > 10) {
PSP2_HandleJoysticks();
SDL_Flip(SCREEN->get_surface()->get_surface());
last_menu_draw_time = SDL_GetTicks();
}
#endif
sound::MusicTick(0.01);
Expand Down
18 changes: 17 additions & 1 deletion src/gui/TextField.cc
Expand Up @@ -32,6 +32,10 @@
#include <algorithm>
#include <iostream>

#ifdef __vita__
#include "psp2_kbdvita.h"
#endif

using namespace enigma::gui;
using namespace ecl;
using namespace std;
Expand Down Expand Up @@ -128,9 +132,21 @@ bool TextField::on_event(const SDL_Event &e) {
bool modified = false;

switch (e.type) {
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONDOWN: {
// set cursor
#ifdef __vita__
handeled = true;
std::string newText = "";
char *imeResult = kbdvita_get("Enter Text", const_cast<char *>(getText().c_str()), 255);
if (imeResult != NULL) {
newText = imeResult;
set_text(newText);
invalidate();
modified = true;
}
#endif
break;
}
case SDL_KEYDOWN:
switch (e.key.keysym.sym) {
case SDLK_RETURN:
Expand Down
7 changes: 6 additions & 1 deletion src/nls.hh
Expand Up @@ -23,7 +23,11 @@ namespace nls
const char *localename;
const char *flagimage;
};

#ifdef __vita__
const Language languages[] = {
{ "default", "", "par" },
};
#else
const Language languages[] = {
{ "default", "", "par" },
{ "беларуская", "be_BY", "flags25x15/by" },
Expand All @@ -47,6 +51,7 @@ namespace nls
{ "Slovenčina", "sk_SK", "flags25x15/sk" },
{ "українська", "uk_UA", "flags25x15/ua" },
};
#endif
}

#endif
168 changes: 168 additions & 0 deletions src/psp2/psp2_kbdvita.c
@@ -0,0 +1,168 @@
#include <string.h>
#include <stdbool.h>
#include <psp2/apputil.h>
#include <psp2/display.h>
#include <psp2/kernel/processmgr.h>
#include <psp2/ime_dialog.h>
#include <psp2/message_dialog.h>
#include <vita2d.h>
#include "psp2_kbdvita.h"

#define IME_DIALOG_RESULT_NONE 0
#define IME_DIALOG_RESULT_RUNNING 1
#define IME_DIALOG_RESULT_FINISHED 2
#define IME_DIALOG_RESULT_CANCELED 3

static int ime_dialog_running = 0;
static int ime_dialog_option = 0;
static int ime_init_apputils = 0;

static uint16_t ime_title_utf16[SCE_IME_DIALOG_MAX_TITLE_LENGTH];
static uint16_t ime_initial_text_utf16[SCE_IME_DIALOG_MAX_TEXT_LENGTH];
static uint16_t ime_input_text_utf16[SCE_IME_DIALOG_MAX_TEXT_LENGTH + 1];
static uint8_t ime_input_text_utf8[SCE_IME_DIALOG_MAX_TEXT_LENGTH + 1];

void utf16_to_utf8(uint16_t *src, uint8_t *dst) {
int i;
for (i = 0; src[i]; i++) {
if ((src[i] & 0xFF80) == 0) {
*(dst++) = src[i] & 0xFF;
} else if((src[i] & 0xF800) == 0) {
*(dst++) = ((src[i] >> 6) & 0xFF) | 0xC0;
*(dst++) = (src[i] & 0x3F) | 0x80;
} else if((src[i] & 0xFC00) == 0xD800 && (src[i + 1] & 0xFC00) == 0xDC00) {
*(dst++) = (((src[i] + 64) >> 8) & 0x3) | 0xF0;
*(dst++) = (((src[i] >> 2) + 16) & 0x3F) | 0x80;
*(dst++) = ((src[i] >> 4) & 0x30) | 0x80 | ((src[i + 1] << 2) & 0xF);
*(dst++) = (src[i + 1] & 0x3F) | 0x80;
i += 1;
} else {
*(dst++) = ((src[i] >> 12) & 0xF) | 0xE0;
*(dst++) = ((src[i] >> 6) & 0x3F) | 0x80;
*(dst++) = (src[i] & 0x3F) | 0x80;
}
}

*dst = '\0';
}

void utf8_to_utf16(uint8_t *src, uint16_t *dst) {
int i;
for (i = 0; src[i];) {
if ((src[i] & 0xE0) == 0xE0) {
*(dst++) = ((src[i] & 0x0F) << 12) | ((src[i + 1] & 0x3F) << 6) | (src[i + 2] & 0x3F);
i += 3;
} else if ((src[i] & 0xC0) == 0xC0) {
*(dst++) = ((src[i] & 0x1F) << 6) | (src[i + 1] & 0x3F);
i += 2;
} else {
*(dst++) = src[i];
i += 1;
}
}

*dst = '\0';
}

int initImeDialog(char *title, char *initial_text, int max_text_length, int type, int option) {
if (ime_dialog_running)
return -1;

// Convert UTF8 to UTF16
utf8_to_utf16((uint8_t *)title, ime_title_utf16);
utf8_to_utf16((uint8_t *)initial_text, ime_initial_text_utf16);

SceImeDialogParam param;
sceImeDialogParamInit(&param);

param.supportedLanguages = 0x0001FFFF;
param.languagesForced = SCE_TRUE;
param.type = type;
param.option = option;
if (option == SCE_IME_OPTION_MULTILINE)
param.dialogMode = SCE_IME_DIALOG_DIALOG_MODE_WITH_CANCEL;
param.title = ime_title_utf16;
param.maxTextLength = max_text_length;
param.initialText = ime_initial_text_utf16;
param.inputTextBuffer = ime_input_text_utf16;

int res = sceImeDialogInit(&param);
if (res >= 0) {
ime_dialog_running = 1;
ime_dialog_option = option;
}

return res;
}

int isImeDialogRunning() {
return ime_dialog_running;
}

uint16_t *getImeDialogInputTextUTF16() {
return ime_input_text_utf16;
}

uint8_t *getImeDialogInputTextUTF8() {
return ime_input_text_utf8;
}

int updateImeDialog() {
if (!ime_dialog_running)
return IME_DIALOG_RESULT_NONE;

SceCommonDialogStatus status = sceImeDialogGetStatus();
if (status == IME_DIALOG_RESULT_FINISHED) {
SceImeDialogResult result;
memset(&result, 0, sizeof(SceImeDialogResult));
sceImeDialogGetResult(&result);

if ((ime_dialog_option == SCE_IME_OPTION_MULTILINE && result.button == SCE_IME_DIALOG_BUTTON_CLOSE) ||
(ime_dialog_option != SCE_IME_OPTION_MULTILINE && result.button == SCE_IME_DIALOG_BUTTON_ENTER)) {
// Convert UTF16 to UTF8
utf16_to_utf8(ime_input_text_utf16, ime_input_text_utf8);
} else {
status = IME_DIALOG_RESULT_CANCELED;
}

sceImeDialogTerm();

ime_dialog_running = 0;
}

return status;
}

char *kbdvita_get(char *title, char *initial_text, int maxLen) {
char *name = NULL;

if (ime_init_apputils == 0) {
sceAppUtilInit(&(SceAppUtilInitParam){}, &(SceAppUtilBootParam){});
sceCommonDialogSetConfigParam(&(SceCommonDialogConfigParam){});
ime_init_apputils = 1;
}

initImeDialog(title, initial_text, maxLen, SCE_IME_TYPE_BASIC_LATIN, 0);

bool done;
do {
vita2d_start_drawing();
vita2d_clear_screen();

done = true;

int ime_result = updateImeDialog();
if (ime_result == IME_DIALOG_RESULT_FINISHED) {
name = (char *)getImeDialogInputTextUTF8();
} else if (ime_result != IME_DIALOG_RESULT_CANCELED) {
done = false;
}

vita2d_end_drawing();
vita2d_common_dialog_update();
vita2d_swap_buffers();
sceDisplayWaitVblankStart();
} while (!done);

return name;
}
14 changes: 14 additions & 0 deletions src/psp2/psp2_kbdvita.h
@@ -0,0 +1,14 @@
#ifndef __KEYBOARD_VITA_H__
#define __KEYBOARD_VITA_H__

#ifdef __cplusplus
extern "C" {
#endif

char *kbdvita_get(char *title, char *initial_text, int maxLen);

#ifdef __cplusplus
}
#endif

#endif
8 changes: 4 additions & 4 deletions src/video.cc
Expand Up @@ -138,11 +138,11 @@ bool Video_SDL::init(int w, int h, int bpp, bool fullscreen) {
SDL_SetVideoModeScaling(x, y, sw, sh);

//This requires a recent SDL-Vita branch SDL12 for example
//https://github.com/rsn8887/SDL-Vita/tree/SDL12
//to compile
SDL_SetVideoModeBilinear(1);
//https://github.com/rsn8887/SDL-Vita/tree/SDL12
//to compile
SDL_SetVideoModeBilinear(1);

SDL_SetVideoModeSync(1);
SDL_SetVideoModeSync(1);
#else
sdlScreen = SDL_SetVideoMode(w, h, bpp, flags);
#endif
Expand Down

0 comments on commit 7ab4b07

Please sign in to comment.