mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-02-19 19:30:42 +00:00
Fix for SDL3 3.1.3 Preview
This commit is contained in:
parent
62b88fa0ae
commit
52c5db16e4
@ -190,7 +190,7 @@ static void (*video_refresh)(void);
|
|||||||
// Prototypes
|
// Prototypes
|
||||||
static int redraw_func(void *arg);
|
static int redraw_func(void *arg);
|
||||||
static int present_sdl_video();
|
static int present_sdl_video();
|
||||||
static int SDLCALL on_sdl_event_generated(void *userdata, SDL_Event * event);
|
static bool SDLCALL on_sdl_event_generated(void *userdata, SDL_Event *event);
|
||||||
static bool is_fullscreen(SDL_Window *);
|
static bool is_fullscreen(SDL_Window *);
|
||||||
|
|
||||||
// From sys_unix.cpp
|
// From sys_unix.cpp
|
||||||
@ -702,9 +702,11 @@ static void shutdown_sdl_video()
|
|||||||
delete_sdl_video_window();
|
delete_sdl_video_window();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_mag_rate()
|
static float get_mag_rate()
|
||||||
{
|
{
|
||||||
int m = PrefsFindInt32("mag_rate");
|
const char *s = PrefsFindString("mag_rate");
|
||||||
|
float m;
|
||||||
|
if (s == NULL || sscanf(s, "%f", &m) != 1) return 1;
|
||||||
return m < 1 ? 1 : m > 4 ? 4 : m;
|
return m < 1 ? 1 : m > 4 ? 4 : m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,7 +744,7 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!sdl_window) {
|
if (!sdl_window) {
|
||||||
int m = get_mag_rate();
|
float m = get_mag_rate();
|
||||||
#ifdef VIDEO_CHROMAKEY
|
#ifdef VIDEO_CHROMAKEY
|
||||||
if (display_type == DISPLAY_CHROMAKEY) {
|
if (display_type == DISPLAY_CHROMAKEY) {
|
||||||
window_flags |= SDL_WINDOW_BORDERLESS | SDL_WINDOW_TRANSPARENT;
|
window_flags |= SDL_WINDOW_BORDERLESS | SDL_WINDOW_TRANSPARENT;
|
||||||
@ -758,9 +760,9 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
|
|||||||
shutdown_sdl_video();
|
shutdown_sdl_video();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
SDL_SyncWindow(sdl_window); // needed for fullscreen
|
||||||
set_window_name();
|
set_window_name();
|
||||||
}
|
}
|
||||||
// if (flags & SDL_WINDOW_FULLSCREEN) SDL_SetWindowGrab(sdl_window, SDL_TRUE);
|
|
||||||
|
|
||||||
// Some SDL events (regarding some native-window events), need processing
|
// Some SDL events (regarding some native-window events), need processing
|
||||||
// as they are generated. SDL2 has a facility, SDL_AddEventWatch(), which
|
// as they are generated. SDL2 has a facility, SDL_AddEventWatch(), which
|
||||||
@ -807,14 +809,16 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
|
|||||||
|
|
||||||
SDL_assert(sdl_texture == NULL);
|
SDL_assert(sdl_texture == NULL);
|
||||||
#ifdef ENABLE_VOSF
|
#ifdef ENABLE_VOSF
|
||||||
sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_XRGB8888, SDL_TEXTUREACCESS_STREAMING, width, height);
|
sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height);
|
||||||
#else
|
#else
|
||||||
sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_BGRX8888, SDL_TEXTUREACCESS_STREAMING, width, height);
|
sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_BGRA8888, SDL_TEXTUREACCESS_STREAMING, width, height);
|
||||||
#endif
|
#endif
|
||||||
if (!sdl_texture) {
|
if (!sdl_texture) {
|
||||||
shutdown_sdl_video();
|
shutdown_sdl_video();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
SDL_SetTextureBlendMode(sdl_texture, SDL_BLENDMODE_NONE);
|
||||||
|
|
||||||
sdl_update_video_rect.x = 0;
|
sdl_update_video_rect.x = 0;
|
||||||
sdl_update_video_rect.y = 0;
|
sdl_update_video_rect.y = 0;
|
||||||
sdl_update_video_rect.w = 0;
|
sdl_update_video_rect.w = 0;
|
||||||
@ -860,7 +864,7 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
|
|||||||
SDL_PixelFormat texture_format = (SDL_PixelFormat)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_FORMAT_NUMBER, 0);
|
SDL_PixelFormat texture_format = (SDL_PixelFormat)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_FORMAT_NUMBER, 0);
|
||||||
int bpp;
|
int bpp;
|
||||||
Uint32 Rmask, Gmask, Bmask, Amask;
|
Uint32 Rmask, Gmask, Bmask, Amask;
|
||||||
if (SDL_GetMasksForPixelFormat(texture_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
|
if (!SDL_GetMasksForPixelFormat(texture_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
|
||||||
printf("ERROR: Unable to determine format for host SDL_surface: %s\n", SDL_GetError());
|
printf("ERROR: Unable to determine format for host SDL_surface: %s\n", SDL_GetError());
|
||||||
shutdown_sdl_video();
|
shutdown_sdl_video();
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -873,14 +877,15 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_SetRenderLogicalPresentation(sdl_renderer, width, height,
|
if (!SDL_SetRenderLogicalPresentation(sdl_renderer, width, height,
|
||||||
PrefsFindBool("scale_integer") ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE : SDL_LOGICAL_PRESENTATION_LETTERBOX,
|
PrefsFindBool("scale_integer") ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE : SDL_LOGICAL_PRESENTATION_LETTERBOX)) {
|
||||||
PrefsFindBool("scale_nearest") ? SDL_SCALEMODE_NEAREST : SDL_SCALEMODE_LINEAR) != 0) {
|
|
||||||
printf("ERROR: Unable to set SDL rendeer's logical size (to %dx%d): %s\n",
|
printf("ERROR: Unable to set SDL rendeer's logical size (to %dx%d): %s\n",
|
||||||
width, height, SDL_GetError());
|
width, height, SDL_GetError());
|
||||||
shutdown_sdl_video();
|
shutdown_sdl_video();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (PrefsFindBool("scale_nearest"))
|
||||||
|
SDL_SetTextureScaleMode(sdl_texture, SDL_SCALEMODE_NEAREST);
|
||||||
|
|
||||||
return guest_surface;
|
return guest_surface;
|
||||||
}
|
}
|
||||||
@ -920,7 +925,7 @@ static int present_sdl_video()
|
|||||||
{
|
{
|
||||||
SDL_Rect destRect = sdl_update_video_rect;
|
SDL_Rect destRect = sdl_update_video_rect;
|
||||||
int result = SDL_BlitSurface(guest_surface, &sdl_update_video_rect, host_surface, &destRect);
|
int result = SDL_BlitSurface(guest_surface, &sdl_update_video_rect, host_surface, &destRect);
|
||||||
if (result != 0) {
|
if (!result) {
|
||||||
SDL_UnlockMutex(sdl_update_video_mutex);
|
SDL_UnlockMutex(sdl_update_video_mutex);
|
||||||
UNLOCK_PALETTE;
|
UNLOCK_PALETTE;
|
||||||
return -1;
|
return -1;
|
||||||
@ -935,7 +940,7 @@ static int present_sdl_video()
|
|||||||
|
|
||||||
uint8_t *dstPixels;
|
uint8_t *dstPixels;
|
||||||
int dstPitch;
|
int dstPitch;
|
||||||
if (SDL_LockTexture(sdl_texture, &sdl_update_video_rect, (void **)&dstPixels, &dstPitch) < 0) {
|
if (!SDL_LockTexture(sdl_texture, &sdl_update_video_rect, (void **)&dstPixels, &dstPitch)) {
|
||||||
SDL_UnlockMutex(sdl_update_video_mutex);
|
SDL_UnlockMutex(sdl_update_video_mutex);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -968,7 +973,7 @@ static int present_sdl_video()
|
|||||||
SDL_UnlockMutex(sdl_update_video_mutex);
|
SDL_UnlockMutex(sdl_update_video_mutex);
|
||||||
|
|
||||||
// Copy the texture to the display
|
// Copy the texture to the display
|
||||||
if (SDL_RenderTexture(sdl_renderer, sdl_texture, NULL, NULL) != 0) {
|
if (!SDL_RenderTexture(sdl_renderer, sdl_texture, NULL, NULL)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1216,7 +1221,7 @@ void driver_base::toggle_mouse_grab(void)
|
|||||||
|
|
||||||
static void update_mouse_grab()
|
static void update_mouse_grab()
|
||||||
{
|
{
|
||||||
SDL_SetWindowRelativeMouseMode(sdl_window, mouse_grabbed ? SDL_TRUE : SDL_FALSE);
|
SDL_SetWindowRelativeMouseMode(sdl_window, mouse_grabbed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grab mouse, switch to relative mouse mode
|
// Grab mouse, switch to relative mouse mode
|
||||||
@ -1672,22 +1677,21 @@ static void do_toggle_fullscreen(void)
|
|||||||
if (sdl_window) {
|
if (sdl_window) {
|
||||||
if (display_type == DISPLAY_SCREEN) {
|
if (display_type == DISPLAY_SCREEN) {
|
||||||
display_type = DISPLAY_WINDOW;
|
display_type = DISPLAY_WINDOW;
|
||||||
SDL_SetWindowFullscreen(sdl_window, SDL_FALSE);
|
SDL_SetWindowFullscreen(sdl_window, false);
|
||||||
const VIDEO_MODE &mode = drv->mode;
|
const VIDEO_MODE &mode = drv->mode;
|
||||||
int m = get_mag_rate();
|
float m = get_mag_rate();
|
||||||
SDL_SetWindowSize(sdl_window, m * VIDEO_MODE_X, m * VIDEO_MODE_Y);
|
SDL_SetWindowSize(sdl_window, m * VIDEO_MODE_X, m * VIDEO_MODE_Y);
|
||||||
//SDL_SetWindowGrab(sdl_window, SDL_FALSE);
|
|
||||||
#ifndef SDL_PLATFORM_MACOS
|
#ifndef SDL_PLATFORM_MACOS
|
||||||
SDL_SetWindowPosition(sdl_window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
SDL_SetWindowPosition(sdl_window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
display_type = DISPLAY_SCREEN;
|
display_type = DISPLAY_SCREEN;
|
||||||
SDL_SetWindowFullscreen(sdl_window, SDL_TRUE);
|
SDL_SetWindowFullscreen(sdl_window, true);
|
||||||
//SDL_SetWindowGrab(sdl_window, SDL_TRUE);
|
|
||||||
#ifdef SDL_PLATFORM_MACOS
|
#ifdef SDL_PLATFORM_MACOS
|
||||||
set_menu_bar_visible_osx(false);
|
set_menu_bar_visible_osx(false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
SDL_SyncWindow(sdl_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
// switch modes
|
// switch modes
|
||||||
@ -1983,7 +1987,7 @@ static bool is_cursor_in_mac_screen()
|
|||||||
deltaY = (int)cursorY - windowY;
|
deltaY = (int)cursorY - windowY;
|
||||||
D(bug("cursor relative {%d,%d}\n", deltaX, deltaY));
|
D(bug("cursor relative {%d,%d}\n", deltaX, deltaY));
|
||||||
const VIDEO_MODE &mode = drv->mode;
|
const VIDEO_MODE &mode = drv->mode;
|
||||||
const int m = get_mag_rate();
|
float m = get_mag_rate();
|
||||||
out = deltaX >= 0 && deltaX < VIDEO_MODE_X * m &&
|
out = deltaX >= 0 && deltaX < VIDEO_MODE_X * m &&
|
||||||
deltaY >= 0 && deltaY < VIDEO_MODE_Y * m;
|
deltaY >= 0 && deltaY < VIDEO_MODE_Y * m;
|
||||||
D(bug("cursor in window? %s\n", out? "yes" : "no"));
|
D(bug("cursor in window? %s\n", out? "yes" : "no"));
|
||||||
@ -2252,7 +2256,7 @@ enum {
|
|||||||
// This function is called by SDL, whenever it generates an SDL_Event. It has
|
// This function is called by SDL, whenever it generates an SDL_Event. It has
|
||||||
// the ability to process events, and optionally, to prevent them from being
|
// the ability to process events, and optionally, to prevent them from being
|
||||||
// added to SDL's event queue (and retrieve-able via SDL_PeepEvents(), etc.)
|
// added to SDL's event queue (and retrieve-able via SDL_PeepEvents(), etc.)
|
||||||
static int SDLCALL on_sdl_event_generated(void *userdata, SDL_Event * event)
|
static bool SDLCALL on_sdl_event_generated(void *userdata, SDL_Event *event)
|
||||||
{
|
{
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
case SDL_EVENT_KEY_UP: {
|
case SDL_EVENT_KEY_UP: {
|
||||||
@ -2311,18 +2315,7 @@ static void handle_events(void)
|
|||||||
if (mouse_grabbed) {
|
if (mouse_grabbed) {
|
||||||
drv->mouse_moved(event.motion.xrel, event.motion.yrel);
|
drv->mouse_moved(event.motion.xrel, event.motion.yrel);
|
||||||
} else {
|
} else {
|
||||||
int x = event.motion.x, y = event.motion.y;
|
SDL_ConvertEventToRenderCoordinates(sdl_renderer, &event);
|
||||||
if (display_type == DISPLAY_SCREEN) {
|
|
||||||
int w, h;
|
|
||||||
SDL_GetWindowSize(sdl_window, &w, &h);
|
|
||||||
const VIDEO_MODE &mode = drv->mode;
|
|
||||||
float mag = std::min((float)w / VIDEO_MODE_X, (float)h / VIDEO_MODE_Y);
|
|
||||||
if (PrefsFindBool("scale_integer")) mag = SDL_floorf(mag);
|
|
||||||
if (mag) {
|
|
||||||
x = (x - (w - mag * VIDEO_MODE_X) / 2) / mag;
|
|
||||||
y = (y - (h - mag * VIDEO_MODE_Y) / 2) / mag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef VIDEO_CHROMAKEY
|
#ifdef VIDEO_CHROMAKEY
|
||||||
if (display_type == DISPLAY_CHROMAKEY) {
|
if (display_type == DISPLAY_CHROMAKEY) {
|
||||||
int xl, yl;
|
int xl, yl;
|
||||||
@ -2334,7 +2327,7 @@ static void handle_events(void)
|
|||||||
set_mouse_ignore(sdl_window, *(uint32 *)p == VIDEO_CHROMAKEY);
|
set_mouse_ignore(sdl_window, *(uint32 *)p == VIDEO_CHROMAKEY);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
drv->mouse_moved(x, y);
|
drv->mouse_moved(event.motion.x, event.motion.y);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user