Skip to content

Commit

Permalink
Merge branch 'Vita3K:master' into mycustom
Browse files Browse the repository at this point in the history
  • Loading branch information
nishinji authored Jul 20, 2023
2 parents df36650 + e1560db commit e538f40
Show file tree
Hide file tree
Showing 10 changed files with 182 additions and 59 deletions.
20 changes: 16 additions & 4 deletions vita3k/gui/src/app_context_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,27 @@ static bool get_update_history(GuiState &gui, EmuEnvState &emuenv, const std::st
if (update.second.find_first_of('\n') != std::string::npos)
update.second.erase(update.second.begin() + update.second.find_first_of('\n'));

while (update.second.find("</li> <li>") != std::string::npos)
if (update.second.find("</li> <li>") != std::string::npos)
update.second.replace(update.second.find("</li> <li>"), update.second.find(endpos) + 2 - update.second.find(startpos), "\n");
while (update.second.find("</li>") != std::string::npos)
if (update.second.find("</li>") != std::string::npos)
update.second.replace(update.second.find("</li>"), 5, "\n");
while (update.second.find("<br>") != std::string::npos)
if (update.second.find("<br>") != std::string::npos)
update.second.replace(update.second.find("<br>"), 4, "\n");
while (update.second.find("<br/>") != std::string::npos)
if (update.second.find("<br/>") != std::string::npos)
update.second.replace(update.second.find("<br/>"), 5, "\n");
while (update.second.find("<li>") != std::string::npos)
if (update.second.find("<li>") != std::string::npos)
update.second.replace(update.second.find("<li>"), update.second.find(endpos) + 1 - update.second.find(startpos), ". ");
update.second.replace(update.second.find("<li>"), 4, reinterpret_cast<const char *>(u8"\u30FB")); // 00B7 or 2022 or 30FB or FF65
while (update.second.find(startpos) != std::string::npos)
if (update.second.find(">") + 1 != std::string::npos)
update.second.erase(update.second.find(startpos), update.second.find(endpos) + 1 - update.second.find(startpos));
while (update.second.find("&nbsp;") != std::string::npos)
if (update.second.find("&nbsp;") != std::string::npos)
update.second.replace(update.second.find("&nbsp;"), 6, " ");
while (update.second.find("&reg;") != std::string::npos)
if (update.second.find("&reg;") != std::string::npos)
update.second.replace(update.second.find("&reg;"), 5, reinterpret_cast<const char *>(u8"\u00AE"));

bool found_space = false;
auto end{ std::remove_if(update.second.begin(), update.second.end(), [&found_space](unsigned ch) {
Expand Down
1 change: 1 addition & 0 deletions vita3k/gui/src/gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ static void init_font(GuiState &gui, EmuEnvState &emuenv) {
0x0100, 0x017F, // Latin Extended A
0x2000, 0x206F, // General Punctuation
0x2150, 0x218F, // Numeral forms
0x2190, 0x21FF, // Arrows
0x2200, 0x22FF, // Math operators
0x2460, 0x24FF, // Enclosed Alphanumerics
0x25A0, 0x26FF, // Miscellaneous symbols
Expand Down
16 changes: 12 additions & 4 deletions vita3k/gui/src/home_screen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -484,10 +484,18 @@ void browse_home_apps_list(GuiState &gui, EmuEnvState &emuenv, const uint32_t bu
gui.vita_area.live_area_screen = gui.live_area_app_current_open >= 0;
gui.vita_area.home_screen = !gui.vita_area.live_area_screen;
break;
case SCE_CTRL_CROSS: {
const auto &selected_app = current_selected_app_index < 0 ? gui.app_selector.sys_apps[current_selected_app_index + 4] : gui.app_selector.user_apps[current_selected_app_index];
pre_load_app(gui, emuenv, emuenv.cfg.show_live_area_screen, selected_app.path);
} break;
case SCE_CTRL_CIRCLE:
if (emuenv.cfg.sys_button == 0) {
const auto &selected_app = current_selected_app_index < 0 ? gui.app_selector.sys_apps[current_selected_app_index + 4] : gui.app_selector.user_apps[current_selected_app_index];
pre_load_app(gui, emuenv, emuenv.cfg.show_live_area_screen, selected_app.path);
}
break;
case SCE_CTRL_CROSS:
if (emuenv.cfg.sys_button == 1) {
const auto &selected_app = current_selected_app_index < 0 ? gui.app_selector.sys_apps[current_selected_app_index + 4] : gui.app_selector.user_apps[current_selected_app_index];
pre_load_app(gui, emuenv, emuenv.cfg.show_live_area_screen, selected_app.path);
}
break;
default: break;
}
}
Expand Down
35 changes: 24 additions & 11 deletions vita3k/gui/src/live_area.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,22 @@ void browse_live_area_apps_list(GuiState &gui, EmuEnvState &emuenv, const uint32

const auto live_area_current_open_apps_list_size = static_cast<int32_t>(gui.live_area_current_open_apps_list.size() - 1);

const auto cancel = [&]() {
close_live_area_app(gui, emuenv, gui.live_area_current_open_apps_list[gui.live_area_app_current_open]);
};
const auto confirm = [&]() {
switch (live_area_type_selected) {
case GATE:
pre_run_app(gui, emuenv, gui.live_area_current_open_apps_list[gui.live_area_app_current_open]);
break;
case MANUAL:
open_manual(gui, emuenv, gui.live_area_current_open_apps_list[gui.live_area_app_current_open]);
break;
default:
break;
}
};

switch (button) {
case SCE_CTRL_UP: {
if (manual_found)
Expand All @@ -596,19 +612,16 @@ void browse_live_area_apps_list(GuiState &gui, EmuEnvState &emuenv, const uint32
live_area_type_selected = GATE;
break;
case SCE_CTRL_CIRCLE:
close_live_area_app(gui, emuenv, gui.live_area_current_open_apps_list[gui.live_area_app_current_open]);
if (emuenv.cfg.sys_button == 1)
cancel();
else
confirm();
break;
case SCE_CTRL_CROSS:
switch (live_area_type_selected) {
case GATE:
pre_run_app(gui, emuenv, gui.live_area_current_open_apps_list[gui.live_area_app_current_open]);
break;
case MANUAL:
open_manual(gui, emuenv, gui.live_area_current_open_apps_list[gui.live_area_app_current_open]);
break;
default:
break;
}
if (emuenv.cfg.sys_button == 1)
confirm();
else
cancel();
break;
default:
break;
Expand Down
7 changes: 5 additions & 2 deletions vita3k/kernel/include/kernel/sync_primitives.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ SceInt32 timer_stop(KernelState &kernel, const char *export_name, SceUID thread_

// Mutex
SceUID mutex_create(SceUID *uid_out, KernelState &kernel, MemState &mem, const char *export_name, const char *name, SceUID thread_id, SceUInt attr, int init_count, Ptr<SceKernelLwMutexWork> workarea, SyncWeight weight);
SceUID mutex_find(KernelState &kernel, const char *export_name, const char *pName);
int mutex_lock(KernelState &kernel, MemState &mem, const char *export_name, SceUID thread_id, SceUID mutexid, int lock_count, unsigned int *timeout, SyncWeight weight);
int mutex_try_lock(KernelState &kernel, MemState &mem, const char *export_name, SceUID thread_id, SceUID mutexid, int lock_count, SyncWeight weight);
int mutex_unlock(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID mutexid, int unlock_count, SyncWeight weight);
Expand All @@ -239,6 +240,7 @@ SceInt32 rwlock_delete(KernelState &kernel, MemState &mem, const char *export_na

// Semaphore
SceUID semaphore_create(KernelState &kernel, const char *export_name, const char *name, SceUID thread_id, SceUInt attr, int initVal, int maxVal);
SceUID semaphore_find(KernelState &kernel, const char *export_name, const char *pName);
SceInt32 semaphore_wait(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID semaId, SceInt32 needCount, SceUInt32 *pTimeout);
int semaphore_signal(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID semaid, int signal);
int semaphore_delete(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID semaid);
Expand All @@ -253,6 +255,7 @@ int condvar_delete(KernelState &kernel, const char *export_name, SceUID thread_i
// Event Flag
SceUID eventflag_clear(KernelState &kernel, const char *export_name, SceUID evfId, SceUInt32 bitPattern);
SceUID eventflag_create(KernelState &kernel, const char *export_name, SceUID thread_id, const char *pName, SceUInt32 attr, SceUInt32 initPattern);
SceUID eventflag_find(KernelState &kernel, const char *export_name, const char *pName);
SceInt32 eventflag_wait(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat, SceUInt32 *pTimeout);
int eventflag_poll(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID eventflagid, unsigned int flags, unsigned int wait, unsigned int *outBits);
SceInt32 eventflag_set(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID evfId, SceUInt32 bitPattern);
Expand All @@ -261,7 +264,7 @@ int eventflag_delete(KernelState &kernel, const char *export_name, SceUID thread

// Message Pipe
SceUID msgpipe_create(KernelState &kernel, const char *export_name, const char *name, SceUID thread_id, SceUInt attr, SceSize bufSize);
SceUID msgpipe_find(KernelState &kernel, const char *export_name, const char *name);
SceUID msgpipe_find(KernelState &kernel, const char *export_name, const char *pName);
SceSize msgpipe_recv(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID msgPipeId, SceUInt32 waitMode, void *pRecvBuf, SceSize recvSize, SceUInt32 *pTimeout);
SceSize msgpipe_send(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID msgPipeId, SceUInt32 waitMode, const void *pSendBuf, SceSize sendSize, SceUInt32 *pTimeout);
SceUID msgpipe_delete(KernelState &kernel, const char *export_name, const char *name, SceUID thread_id, SceUID msgpipe_id);
SceInt32 msgpipe_delete(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID msgpipe_id);
79 changes: 70 additions & 9 deletions vita3k/kernel/src/sync_primitives.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,25 @@ SceUID mutex_create(SceUID *uid_out, KernelState &kernel, MemState &mem, const c
return SCE_KERNEL_OK;
}

SceUID mutex_find(KernelState &kernel, const char *export_name, const char *pName) {
if (strlen(pName) > KERNELOBJECT_MAX_NAME_LENGTH)
return RET_ERROR(SCE_KERNEL_ERROR_UID_NAME_TOO_LONG);

if (LOG_SYNC_PRIMITIVES)
LOG_DEBUG("{}: name: \"{}\"", export_name, pName);

const std::lock_guard<std::mutex> kernel_lock(kernel.mutex);

const auto it = std::find_if(kernel.mutexes.begin(), kernel.mutexes.end(), [=](const auto &mutex) {
return strncmp(mutex.second->name, pName, KERNELOBJECT_MAX_NAME_LENGTH) == 0;
});

if (it != kernel.mutexes.end())
return it->first;

return RET_ERROR(SCE_KERNEL_ERROR_UID_CANNOT_FIND_BY_NAME);
}

inline int mutex_lock_impl(KernelState &kernel, MemState &mem, const char *export_name, SceUID thread_id, int lock_count, MutexPtr &mutex, SyncWeight weight, SceUInt *timeout, bool only_try) {
if (LOG_SYNC_PRIMITIVES) {
LOG_DEBUG("{}: uid: {} thread_id: {} name: \"{}\" attr: {} lock_count: {} timeout: {} waiting_threads: {}",
Expand Down Expand Up @@ -971,6 +990,25 @@ SceUID semaphore_create(KernelState &kernel, const char *export_name, const char
return uid;
}

SceUID semaphore_find(KernelState &kernel, const char *export_name, const char *pName) {
if (strlen(pName) > KERNELOBJECT_MAX_NAME_LENGTH)
return RET_ERROR(SCE_KERNEL_ERROR_UID_NAME_TOO_LONG);

if (LOG_SYNC_PRIMITIVES)
LOG_DEBUG("{}: name: \"{}\"", export_name, pName);

const std::lock_guard<std::mutex> kernel_lock(kernel.mutex);

const auto it = std::find_if(kernel.semaphores.begin(), kernel.semaphores.end(), [=](const auto &sema) {
return strncmp(sema.second->name, pName, KERNELOBJECT_MAX_NAME_LENGTH) == 0;
});

if (it != kernel.semaphores.end())
return it->first;

return RET_ERROR(SCE_KERNEL_ERROR_UID_CANNOT_FIND_BY_NAME);
}

SceInt32 semaphore_wait(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID semaId, SceInt32 needCount, SceUInt32 *pTimeout) {
assert(semaId >= 0);

Expand Down Expand Up @@ -1302,7 +1340,7 @@ SceUID eventflag_clear(KernelState &kernel, const char *export_name, SceUID evfI
}

SceUID eventflag_create(KernelState &kernel, const char *export_name, SceUID thread_id, const char *pName, SceUInt32 attr, SceUInt32 initPattern) {
if ((strlen(pName) > 31) && ((attr & 0x80) == 0x80)) {
if ((strlen(pName) > KERNELOBJECT_MAX_NAME_LENGTH) && ((attr & 0x80) == 0x80)) {
return RET_ERROR(SCE_KERNEL_ERROR_UID_NAME_TOO_LONG);
}

Expand Down Expand Up @@ -1330,6 +1368,25 @@ SceUID eventflag_create(KernelState &kernel, const char *export_name, SceUID thr
return uid;
}

SceUID eventflag_find(KernelState &kernel, const char *export_name, const char *pName) {
if (strlen(pName) > KERNELOBJECT_MAX_NAME_LENGTH)
return RET_ERROR(SCE_KERNEL_ERROR_UID_NAME_TOO_LONG);

if (LOG_SYNC_PRIMITIVES)
LOG_DEBUG("{}: name: \"{}\"", export_name, pName);

const std::lock_guard<std::mutex> kernel_lock(kernel.mutex);

const auto it = std::find_if(kernel.eventflags.begin(), kernel.eventflags.end(), [=](const auto &evf) {
return strncmp(evf.second->name, pName, KERNELOBJECT_MAX_NAME_LENGTH) == 0;
});

if (it != kernel.eventflags.end())
return it->first;

return RET_ERROR(SCE_KERNEL_ERROR_UID_CANNOT_FIND_BY_NAME);
}

static int eventflag_waitorpoll(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID event_id, unsigned int flags, unsigned int wait, unsigned int *outBits, SceUInt *timeout, bool dowait) {
assert(event_id >= 0);

Expand Down Expand Up @@ -1574,19 +1631,23 @@ SceUID msgpipe_create(KernelState &kernel, const char *export_name, const char *
return uid;
}

SceUID msgpipe_find(KernelState &kernel, const char *export_name, const char *name) {
SceUID msgpipe_find(KernelState &kernel, const char *export_name, const char *pName) {
if (strlen(pName) > KERNELOBJECT_MAX_NAME_LENGTH)
return RET_ERROR(SCE_KERNEL_ERROR_UID_NAME_TOO_LONG);

if (LOG_SYNC_PRIMITIVES)
LOG_DEBUG("{}: name: \"{}\"", export_name, pName);

const std::lock_guard<std::mutex> kernel_lock(kernel.mutex);

// TODO use another map
const auto it = std::find_if(kernel.msgpipes.begin(), kernel.msgpipes.end(), [=](auto it) {
return strcmp(it.second->name, name) == 0;
const auto it = std::find_if(kernel.msgpipes.begin(), kernel.msgpipes.end(), [=](const auto &msg_pipe) {
return strncmp(msg_pipe.second->name, pName, KERNELOBJECT_MAX_NAME_LENGTH) == 0;
});

if (it != kernel.msgpipes.end()) {
if (it != kernel.msgpipes.end())
return it->first;
}

return RET_ERROR(SCE_KERNEL_ERROR_UNKNOWN_MSG_PIPE_ID);
return RET_ERROR(SCE_KERNEL_ERROR_UID_CANNOT_FIND_BY_NAME);
}

SceSize msgpipe_recv(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID msgPipeId, SceUInt32 waitMode, void *pRecvBuf, SceSize recvSize, SceUInt32 *pTimeout) {
Expand Down Expand Up @@ -1802,7 +1863,7 @@ SceSize msgpipe_send(KernelState &kernel, const char *export_name, SceUID thread
}
}

SceUID msgpipe_delete(KernelState &kernel, const char *export_name, const char *name, SceUID thread_id, SceUID msgpipe_id) {
SceInt32 msgpipe_delete(KernelState &kernel, const char *export_name, SceUID thread_id, SceUID msgpipe_id) {
assert(msgpipe_id >= 0);

const MsgPipePtr msgpipe = lock_and_find(msgpipe_id, kernel.msgpipes, kernel.mutex);
Expand Down
28 changes: 14 additions & 14 deletions vita3k/modules/SceKernelThreadMgr/SceThreadmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1081,9 +1081,9 @@ EXPORT(int, sceKernelDeleteEventFlag, SceUID event_id) {
return eventflag_delete(emuenv.kernel, export_name, thread_id, event_id);
}

EXPORT(int, sceKernelDeleteMsgPipe) {
TRACY_FUNC(sceKernelDeleteMsgPipe);
return UNIMPLEMENTED();
EXPORT(SceInt32, sceKernelDeleteMsgPipe, SceUID msgPipeId) {
TRACY_FUNC(sceKernelDeleteMsgPipe, msgPipeId);
return msgpipe_delete(emuenv.kernel, export_name, thread_id, msgPipeId);
}

EXPORT(int, sceKernelDeleteMutex, SceUID mutexid) {
Expand Down Expand Up @@ -1214,19 +1214,19 @@ EXPORT(int, sceKernelOpenCond) {
return UNIMPLEMENTED();
}

EXPORT(int, sceKernelOpenEventFlag, const char *pName) {
EXPORT(SceUID, sceKernelOpenEventFlag, const char *pName) {
TRACY_FUNC(sceKernelOpenEventFlag, pName);
return UNIMPLEMENTED();
return eventflag_find(emuenv.kernel, export_name, pName);
}

EXPORT(int, sceKernelOpenMsgPipe, const char *name) {
TRACY_FUNC(sceKernelOpenMsgPipe, name);
return msgpipe_find(emuenv.kernel, export_name, name);
EXPORT(SceUID, sceKernelOpenMsgPipe, const char *pName) {
TRACY_FUNC(sceKernelOpenMsgPipe, pName);
return msgpipe_find(emuenv.kernel, export_name, pName);
}

EXPORT(int, sceKernelOpenMutex) {
TRACY_FUNC(sceKernelOpenMutex);
return UNIMPLEMENTED();
EXPORT(SceUID, sceKernelOpenMutex, const char *pName) {
TRACY_FUNC(sceKernelOpenMutex, pName);
return mutex_find(emuenv.kernel, export_name, pName);
}

EXPORT(int, sceKernelOpenMutex_089) {
Expand All @@ -1239,9 +1239,9 @@ EXPORT(int, sceKernelOpenRWLock) {
return UNIMPLEMENTED();
}

EXPORT(int, sceKernelOpenSema) {
TRACY_FUNC(sceKernelOpenSema);
return UNIMPLEMENTED();
EXPORT(SceUID, sceKernelOpenSema, const char *pName) {
TRACY_FUNC(sceKernelOpenSema, pName);
return semaphore_find(emuenv.kernel, export_name, pName);
}

EXPORT(int, sceKernelOpenSimpleEvent) {
Expand Down
Loading

0 comments on commit e538f40

Please sign in to comment.