Delegate title setting to main thread on macOS

Resizing is done in main thread regardless of Unix platform
This commit is contained in:
Cacodemon345
2021-08-26 00:15:42 +06:00
parent 1fa760a161
commit 6d84d19380
2 changed files with 61 additions and 16 deletions

View File

@@ -41,6 +41,8 @@ int kbd_req_capture;
int hide_status_bar; int hide_status_bar;
int fixed_size_x = 640; int fixed_size_x = 640;
int fixed_size_y = 480; int fixed_size_y = 480;
extern int title_set;
extern wchar_t sdl_win_title[512];
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
joystick_t joystick_state[MAX_JOYSTICKS]; joystick_t joystick_state[MAX_JOYSTICKS];
int joysticks_present; int joysticks_present;
@@ -509,7 +511,7 @@ do_stop(void)
is_quit = 1; is_quit = 1;
startblit(); //startblit();
sdl_close(); sdl_close();
@@ -682,7 +684,7 @@ void monitor_thread(void* param)
} }
} }
} }
SDL_threadID eventthread;
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
SDL_Event event; SDL_Event event;
@@ -694,6 +696,8 @@ int main(int argc, char** argv)
SDL_Quit(); SDL_Quit();
return 6; return 6;
} }
eventthread = SDL_ThreadID();
blitmtx = SDL_CreateMutex(); blitmtx = SDL_CreateMutex();
if (!blitmtx) if (!blitmtx)
{ {
@@ -816,15 +820,20 @@ int main(int argc, char** argv)
{ {
plat_mouse_capture(0); plat_mouse_capture(0);
} }
if (SDL_GetTicks() - onesec_tic >= 1000)
{
onesec_tic = SDL_GetTicks();
pc_onesec();
}
if (blitreq) if (blitreq)
{ {
extern void sdl_blit(int x, int y, int y1, int y2, int w, int h); extern void sdl_blit(int x, int y, int y1, int y2, int w, int h);
sdl_blit(params.x, params.y, params.y1, params.y2, params.w, params.h); sdl_blit(params.x, params.y, params.y1, params.y2, params.w, params.h);
} }
if (SDL_GetTicks() - onesec_tic >= 1000) if (title_set)
{ {
onesec_tic = SDL_GetTicks(); extern void ui_window_title_real();
pc_onesec(); ui_window_title_real();
} }
if (exit_event) if (exit_event)
{ {

View File

@@ -38,6 +38,10 @@ static int cur_wx = 0, cur_wy = 0, cur_ww =0, cur_wh = 0;
static volatile int sdl_enabled = 1; static volatile int sdl_enabled = 1;
static SDL_mutex* sdl_mutex = NULL; static SDL_mutex* sdl_mutex = NULL;
int mouse_capture; int mouse_capture;
int title_set = 0;
int resize_pending = 0;
int resize_w = 0;
int resize_h = 0;
static void static void
sdl_integer_scale(double *d, double *g) sdl_integer_scale(double *d, double *g)
@@ -128,6 +132,8 @@ sdl_blit_shim(int x, int y, int y1, int y2, int w, int h)
blitreq = 1; blitreq = 1;
} }
void ui_window_title_real();
void void
sdl_blit(int x, int y, int y1, int y2, int w, int h) sdl_blit(int x, int y, int y1, int y2, int w, int h)
{ {
@@ -141,6 +147,11 @@ sdl_blit(int x, int y, int y1, int y2, int w, int h)
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
if (resize_pending)
{
sdl_resize(resize_w, resize_h);
resize_pending = 0;
}
r_src.x = 0; r_src.x = 0;
r_src.y = y1; r_src.y = y1;
r_src.w = w; r_src.w = w;
@@ -308,7 +319,6 @@ sdl_resize(int x, int y)
cur_wh = wh; cur_wh = wh;
SDL_SetWindowSize(sdl_win, cur_ww, cur_wh); SDL_SetWindowSize(sdl_win, cur_ww, cur_wh);
SDL_SetWindowPosition(sdl_win, cur_wx, cur_wy);
sdl_reinit_texture(); sdl_reinit_texture();
@@ -419,26 +429,52 @@ int real_sdl_w = SCREEN_RES_X, real_sdl_h = SCREEN_RES_Y;
void plat_resize(int w, int h) void plat_resize(int w, int h)
{ {
SDL_SetWindowSize(sdl_win, w, h); SDL_LockMutex(sdl_mutex);
real_sdl_w = w, real_sdl_h = h; resize_w = w;
resize_h = h;
resize_pending = 1;
SDL_UnlockMutex(sdl_mutex);
} }
wchar_t sdl_win_title[512] = L"86Box"; wchar_t sdl_win_title[512] = { L'8', L'6', L'B', L'o', L'x', 0 };
wchar_t* ui_window_title(wchar_t* str) SDL_mutex* titlemtx = NULL;
void ui_window_title_real()
{ {
char* res; char* res;
if (!str) return sdl_win_title;
if (sizeof(wchar_t) == 1) if (sizeof(wchar_t) == 1)
{ {
SDL_SetWindowTitle(sdl_win, (char*)str); SDL_SetWindowTitle(sdl_win, (char*)sdl_win_title);
return str; return;
} }
res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)str, wcslen(str) * sizeof(wchar_t) + sizeof(wchar_t)); res = SDL_iconv_string("UTF-8", sizeof(wchar_t) == 2 ? "UTF-16LE" : "UTF-32LE", (char*)sdl_win_title, wcslen(sdl_win_title) * sizeof(wchar_t) + sizeof(wchar_t));
if (res) if (res)
{ {
SDL_SetWindowTitle(sdl_win, res); SDL_SetWindowTitle(sdl_win, res);
wcsncpy(sdl_win_title, str, 512);
SDL_free((void*)res); SDL_free((void*)res);
} }
title_set = 0;
}
extern SDL_threadID eventthread;
/* Only activate threading path on macOS, otherwise it will softlock Xorg.
Wayland doesn't seem to have this issue. */
wchar_t* ui_window_title(wchar_t* str)
{
if (!str) return sdl_win_title;
#ifdef __APPLE__
if (eventthread == SDL_ThreadID())
#endif
{
memset(sdl_win_title, 0, sizeof(sdl_win_title));
wcsncpy(sdl_win_title, str, 512);
ui_window_title_real();
return str;
}
#ifdef __APPLE__
memset(sdl_win_title, 0, sizeof(sdl_win_title));
wcsncpy(sdl_win_title, str, 512);
title_set = 1;
#endif
return str; return str;
} }