dosbox-x/include/sdlmain.h
Jaak Ristioja 4a6bcc706e
Use nullptr/NULL instead of 0 for pointers, two fixes for undefined behavior
This commit fixes most -Wzero-as-null-pointer-constant warnings, except in
some places which appear to be vendored 3rd party libraries, e.g. in sdl_ttf.c,
libchdr, physfs and gmock and in 3rd party components therein. Since it might
make more sense to update this 3rd party code to some later versions instead of
fixing the warnings manually, I decided not to enable the C++ compiler flag in
configure.ac at this point.

In two functions with the return type of std::string executed `return 0;`
statements, causing std::string to be constructed from a null pointer. To avoid
undefined behavior these were changed to `return {};`.

Signed-off-by: Jaak Ristioja <jaak@ristioja.ee>
2024-05-09 14:18:10 +03:00

253 lines
6.5 KiB
C++

#include "menu.h"
#include "mouse.h"
#include "video.h"
#include "SDL.h"
#ifdef __WIN32__
#include "SDL_syswm.h"
#endif
#ifndef DOSBOX_SDLMAIN_H
#define DOSBOX_SDLMAIN_H
#include "zipfile.h"
#include <output/output_gamelink.h>
enum SCREEN_TYPES {
SCREEN_SURFACE
,SCREEN_OPENGL // [FIXME] cannot make this conditional because somehow SDL2 code uses it while C_OPENGL is definitely disabled by C_SDL2 so SCREEN_OPENGL is unavailable
#if C_DIRECT3D
,SCREEN_DIRECT3D
#endif
,SCREEN_TTF
,SCREEN_GAMELINK
};
enum AUTOLOCK_FEEDBACK
{
AUTOLOCK_FEEDBACK_NONE,
AUTOLOCK_FEEDBACK_BEEP,
AUTOLOCK_FEEDBACK_FLASH
};
enum PRIORITY_LEVELS {
PRIORITY_LEVEL_PAUSE,
PRIORITY_LEVEL_LOWEST,
PRIORITY_LEVEL_LOWER,
PRIORITY_LEVEL_NORMAL,
PRIORITY_LEVEL_HIGHER,
PRIORITY_LEVEL_HIGHEST
};
enum method {
METHOD_NONE = 0,
METHOD_X11,
METHOD_XRANDR,
METHOD_WIN98BASE,
METHOD_COREGRAPHICS
};
// Screen DPI and size info
class ScreenSizeInfo {
public:
struct wxh {
double width = -1;
double height = -1;
void clear(void) {
width = height = -1;
}
};
struct xvy {
double x = 0;
double y = 0;
void clear(void) {
x = y = 0;
}
};
public:
xvy screen_position_pixels; // position of the screen on the "virtual" overall desktop
wxh screen_dimensions_pixels; // size of the screen in pixels
wxh screen_dimensions_mm; // size of the screen in mm
wxh screen_dpi; // DPI of the screen
enum method method = METHOD_NONE;
public:
void clear(void) {
screen_dpi.clear();
screen_dimensions_mm.clear();
screen_dimensions_pixels.clear();
screen_position_pixels.clear();
method = METHOD_NONE;
}
};
extern ScreenSizeInfo screen_size_info;
struct SDL_Block {
bool inited = false;
bool active = false; // if this isn't set don't draw
bool updating = false;
#if defined(C_SDL2)
bool update_window = false;
bool update_display_contents = false;
int window_desired_width = 0, window_desired_height = 0;
#endif
struct {
uint32_t width = 0;
uint32_t height = 0;
uint32_t bpp = 0;
Bitu flags = 0;
double scalex = 0, scaley = 0;
GFX_CallBack_t callback = nullptr;
} draw;
bool wait_on_error = false;
struct {
struct {
uint16_t width = 0, height = 0;
bool fixed = false;
bool display_res = false;
bool width_auto = false, height_auto = false;
} full;
struct {
uint16_t width = 0, height = 0;
} window;
uint8_t bpp = 0;
#if defined(C_SDL2)
uint32_t pixelFormat = 0;
#endif
bool fullscreen = false;
bool lazy_fullscreen = false;
bool prevent_fullscreen = false;
bool lazy_fullscreen_req = false;
bool doublebuf = false;
bool isperfect = false;
SCREEN_TYPES type = (SCREEN_TYPES)0;
SCREEN_TYPES want_type = (SCREEN_TYPES)0;
} desktop;
#if C_GAMELINK
struct {
Bitu pitch;
void * framebuf;
GameLink::sSharedMMapInput_R2 input_prev;
GameLink::sSharedMMapInput_R2 input;
GameLink::sSharedMMapAudio_R1 audio;
bool want_mouse;
bool enable;
bool snoop;
Bitu loadaddr;
} gamelink;
#endif // C_GAMELINK
struct {
SDL_Surface * surface = NULL;
#if (HAVE_DDRAW_H) && defined(WIN32)
RECT rect = {};
#endif
} blit;
struct {
PRIORITY_LEVELS focus = (PRIORITY_LEVELS)0;
PRIORITY_LEVELS nofocus = (PRIORITY_LEVELS)0;
} priority;
SDL_Rect clip = {};
SDL_Surface * surface = NULL;
#if defined(C_SDL2)
SDL_Window * window = NULL;
SDL_Renderer * renderer = NULL;
const char * rendererDriver = NULL;
struct {
SDL_Texture * texture = NULL;
SDL_PixelFormat * pixelFormat = NULL;
} texture;
#endif
int displayNumber = 0;
SDL_cond *cond = NULL;
struct {
bool autolock = false;
AUTOLOCK_FEEDBACK autolock_feedback = (AUTOLOCK_FEEDBACK)0;
bool autoenable = false;
bool requestlock = false;
bool locked = false;
int xsensitivity = 0;
int ysensitivity = 0;
MOUSE_EMULATION emulation = (MOUSE_EMULATION)0;
} mouse;
SDL_Rect updateRects[1024] = {};
Bitu overscan_color = 0;
Bitu overscan_width = 0;
Bitu num_joysticks = 0;
#if defined (WIN32)
bool using_windib = false;
// Time when sdl regains focus (alt-tab) in windowed mode
uint32_t focus_ticks = 0;
uint32_t ime_ticks;
#endif
#if defined(MACOSX)
uint32_t ime_ticks;
#endif
// state of alt-keys for certain special handlings
uint16_t laltstate = 0, raltstate = 0;
uint16_t lctrlstate = 0, rctrlstate = 0;
uint16_t lshiftstate = 0, rshiftstate = 0;
bool must_redraw_all = false;
bool deferred_resize = false;
bool window_too_small = false;
bool init_ignore = false;
unsigned int gfx_force_redraw_count = 0;
struct {
int x = 0;
int y = 0;
double xToY = 0;
double yToX = 0;
} srcAspect;
#if C_SURFACE_POSTRENDER_ASPECT
std::vector<uint32_t> aspectbuf = {};
#endif
};
#if defined(WIN32) && !defined(C_SDL2)
extern "C" unsigned int SDL1_hax_inhibit_WM_PAINT;
#endif
extern Bitu frames;
extern SDL_Block sdl;
extern Bitu userResizeWindowWidth;
extern Bitu userResizeWindowHeight;
extern Bitu currentWindowWidth;
extern Bitu currentWindowHeight;
void GFX_DrawSDLMenu(DOSBoxMenu &menu, DOSBoxMenu::displaylist &dl);
void GFX_LogSDLState(void);
void GFX_SDL_Overscan(void);
void GFX_SetIcon(void);
void GFX_ForceFullscreenExit(void);
void SDL_rect_cliptoscreen(SDL_Rect &r);
void UpdateWindowDimensions(void);
void UpdateWindowDimensions(Bitu width, Bitu height);
void DoKillSwitch();
void ResetSystem(bool pressed);
void PauseDOSBox(bool pressed);
bool systemmessagebox(char const * aTitle, char const * aMessage, char const * aDialogType, char const * aIconType, int aDefaultButton);
int GetNumScreen();
#if defined(C_SDL2)
SDL_Window* GFX_SetSDLWindowMode(uint16_t width, uint16_t height, SCREEN_TYPES screenType);
#endif
#if defined(C_SDL2) && defined(C_OPENGL)/*HACK*/
void SDL_GL_SwapBuffers(void);
#endif
#if defined(WIN32) && !defined(HX_DOS)
extern int curscreen;
extern RECT monrect;
typedef struct {
int x, y;
} xyp;
BOOL CALLBACK EnumDispProc(HMONITOR hMon, HDC dcMon, RECT* pRcMon, LPARAM lParam);
#endif
#endif /*DOSBOX_SDLMAIN_H*/