DOSBox-X
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
include/sdlmain.h
00001 #include "dosbox.h"
00002 
00003 #include "control.h"
00004 #include "menu.h"
00005 #include "mouse.h"
00006 #include "render.h"
00007 #include "video.h"
00008 
00009 #include "cross.h"
00010 #include "SDL.h"
00011 #include "SDL_video.h"
00012 
00013 #ifdef __WIN32__
00014 #include "SDL_syswm.h"
00015 #endif
00016 
00017 #ifndef DOSBOX_SDLMAIN_H
00018 #define DOSBOX_SDLMAIN_H
00019 
00020 enum SCREEN_TYPES {
00021     SCREEN_SURFACE
00022     ,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
00023 #if C_DIRECT3D
00024     ,SCREEN_DIRECT3D
00025 #endif
00026 };
00027 
00028 enum AUTOLOCK_FEEDBACK
00029 {
00030     AUTOLOCK_FEEDBACK_NONE,
00031     AUTOLOCK_FEEDBACK_BEEP,
00032     AUTOLOCK_FEEDBACK_FLASH
00033 };
00034 
00035 enum PRIORITY_LEVELS {
00036     PRIORITY_LEVEL_PAUSE,
00037     PRIORITY_LEVEL_LOWEST,
00038     PRIORITY_LEVEL_LOWER,
00039     PRIORITY_LEVEL_NORMAL,
00040     PRIORITY_LEVEL_HIGHER,
00041     PRIORITY_LEVEL_HIGHEST
00042 };
00043 
00044 // Screen DPI and size info
00045 class ScreenSizeInfo {
00046 public:
00047     enum method {
00048         METHOD_NONE=0,
00049         METHOD_X11,
00050         METHOD_XRANDR,
00051         METHOD_WIN98BASE,
00052         METHOD_COREGRAPHICS
00053     };
00054 public:
00055     struct wxh {
00056         double      width = -1;
00057         double      height = -1;
00058 
00059         void clear(void) {
00060             width = height = -1;
00061         }
00062     };
00063     struct xvy {
00064         double      x = 0;
00065         double      y = 0;
00066 
00067         void clear(void) {
00068             x = y = 0;
00069         }
00070     };
00071 public:
00072     xvy             screen_position_pixels;     // position of the screen on the "virtual" overall desktop
00073     wxh             screen_dimensions_pixels;   // size of the screen in pixels
00074     wxh             screen_dimensions_mm;       // size of the screen in mm
00075     wxh             screen_dpi;                 // DPI of the screen
00076     enum method     method = METHOD_NONE;
00077 public:
00078     void clear(void) {
00079         screen_dpi.clear();
00080         screen_dimensions_mm.clear();
00081         screen_dimensions_pixels.clear();
00082         screen_position_pixels.clear();
00083         method = METHOD_NONE;
00084     }
00085 };
00086 
00087 extern ScreenSizeInfo       screen_size_info;
00088 
00089 struct SDL_Block {
00090     bool inited = false;
00091     bool active = false; // if this isn't set don't draw
00092     bool updating = false;
00093 #if defined(C_SDL2)
00094     bool update_window = false;
00095     bool update_display_contents = false;
00096     int window_desired_width = 0, window_desired_height = 0;
00097 #endif
00098     struct {
00099         Bit32u width = 0;
00100         Bit32u height = 0;
00101         Bit32u bpp = 0;
00102         Bitu flags = 0;
00103         double scalex = 0, scaley = 0;
00104         GFX_CallBack_t callback = 0;
00105     } draw;
00106     bool wait_on_error = false;
00107     struct {
00108         struct {
00109             Bit16u width = 0, height = 0;
00110             bool fixed = false;
00111             bool display_res = false;
00112             bool width_auto = false, height_auto = false;
00113         } full;
00114         struct {
00115             Bit16u width = 0, height = 0;
00116         } window;
00117         Bit8u bpp = 0;
00118 #if defined(C_SDL2)
00119         Bit32u pixelFormat = 0;
00120 #endif
00121         bool fullscreen = false;
00122         bool lazy_fullscreen = false;
00123         bool prevent_fullscreen = false;
00124         bool lazy_fullscreen_req = false;
00125         bool doublebuf = false;
00126         SCREEN_TYPES type = (SCREEN_TYPES)0;
00127         SCREEN_TYPES want_type = (SCREEN_TYPES)0;
00128     } desktop;
00129     struct {
00130         SDL_Surface * surface = NULL;
00131 #if (HAVE_DDRAW_H) && defined(WIN32)
00132         RECT rect = {};
00133 #endif
00134     } blit;
00135     struct {
00136         PRIORITY_LEVELS focus = (PRIORITY_LEVELS)0;
00137         PRIORITY_LEVELS nofocus = (PRIORITY_LEVELS)0;
00138     } priority;
00139     SDL_Rect clip = {};
00140     SDL_Surface * surface = NULL;
00141 #if defined(C_SDL2)
00142     SDL_Window * window = NULL;
00143     SDL_Renderer * renderer = NULL;
00144     const char * rendererDriver = NULL;
00145     int displayNumber = 0;
00146     struct {
00147         SDL_Texture * texture = NULL;
00148         SDL_PixelFormat * pixelFormat = NULL;
00149     } texture;
00150 #endif
00151     SDL_cond *cond = NULL;
00152     struct {
00153         bool autolock = false;
00154         AUTOLOCK_FEEDBACK autolock_feedback = (AUTOLOCK_FEEDBACK)0;
00155         bool autoenable = false;
00156         bool requestlock = false;
00157         bool locked = false;
00158         int xsensitivity = 0;
00159         int ysensitivity = 0;
00160         MOUSE_EMULATION emulation = (MOUSE_EMULATION)0;
00161     } mouse;
00162     SDL_Rect updateRects[1024] = {};
00163     Bitu overscan_color = 0;
00164     Bitu overscan_width = 0;
00165     Bitu num_joysticks = 0;
00166 #if defined (WIN32)
00167     bool using_windib = false;
00168     // Time when sdl regains focus (alt-tab) in windowed mode
00169     Bit32u focus_ticks = 0;
00170 #endif
00171     // state of alt-keys for certain special handlings
00172     Bit16u laltstate = 0;
00173     Bit16u raltstate = 0;
00174     bool must_redraw_all = false;
00175     bool deferred_resize = false;
00176     bool init_ignore = false;
00177     unsigned int gfx_force_redraw_count = 0;
00178     struct {
00179         int x = 0;
00180         int y = 0;
00181         double xToY = 0;
00182         double yToX = 0;
00183     } srcAspect;
00184 #if C_SURFACE_POSTRENDER_ASPECT
00185     std::vector<uint32_t> aspectbuf = {};
00186 #endif
00187 };
00188 
00189 #if defined(WIN32) && !defined(C_SDL2)
00190 extern "C" unsigned int SDL1_hax_inhibit_WM_PAINT;
00191 #endif
00192 
00193 extern Bitu frames;
00194 extern SDL_Block sdl;
00195 
00196 #include <output/output_surface.h>
00197 #include <output/output_direct3d.h>
00198 #include <output/output_opengl.h>
00199 #include <output/output_tools.h>
00200 #include <output/output_tools_xbrz.h>
00201 
00202 #include "zipfile.h"
00203 
00204 extern Bitu userResizeWindowWidth;
00205 extern Bitu userResizeWindowHeight;
00206 extern Bitu currentWindowWidth;
00207 extern Bitu currentWindowHeight;
00208 
00209 extern ZIPFile savestate_zip;
00210 
00211 void GFX_DrawSDLMenu(DOSBoxMenu &menu, DOSBoxMenu::displaylist &dl);
00212 void GFX_LogSDLState(void);
00213 void GFX_SDL_Overscan(void);
00214 void GFX_SetIcon(void);
00215 void SDL_rect_cliptoscreen(SDL_Rect &r);
00216 void UpdateWindowDimensions(void);
00217 void UpdateWindowDimensions(Bitu width, Bitu height);
00218 
00219 #if defined(C_SDL2)
00220 SDL_Window* GFX_SetSDLWindowMode(Bit16u width, Bit16u height, SCREEN_TYPES screenType);
00221 #endif
00222 
00223 #if defined(C_SDL2) && defined(C_OPENGL)/*HACK*/
00224 void SDL_GL_SwapBuffers(void);
00225 #endif
00226 
00227 #endif /*DOSBOX_SDLMAIN_H*/