Replace SDL 1.2 with SDL 2.0
This massive patch is based on work of NY00123, which was published on Vogons forum in 2013 and was waiting for inclusion in SVN since then: https://www.vogons.org/viewtopic.php?f=41&t=34770 Revision from December 2018 was used to kickstart this work. However, a number of changes were implemented: - Original patch preserves all SDL 1.2 code by ifdefing it; this patch completely removes all code ifdefed for several versions of SDL 1.2.* This way the code will be easier to maintain going forward and features enabled by SDL 2.0 do not need to be backported. A side-effect of this change is almost-complete removal of DirectDraw support - but users can now use Direct3D based acceleration (without any ifdefs in code). - Code ifdefed for Android was removed to make the project easier to understand and modify. Android port should still be possible, but it requires more work (mostly CI and buildsystem work). Android-related functionalities that were cross-platform were preserved. - Code ifdefed for OpenGL ES (which was only used for Android) was removed - this should not affect Android support, as hardware-accelerated 2D should still be viable via "texture" output, but it was not tested, as buildsystem does not support Android ATM. - SDL_cdrom code is not included; it was outside of scope of SDL2 changes. Inclusion of that library did not justify supporting one small usecase (playblack of CD audio from physical CDs). - Few code warning were fixed (but new sdl_mapper implementation introduces many, many new warnings). - Some formatting changes were implemented. Overall, the original patch had ~40k lines of code - here it was trimmed to +769,-972 (so more old code got removed than new code added). This implementation was extensively tested on Linux and somewhat tested on Windows 10. It fixes numerous issues (too many too list). Testing found two small regressions: - Starting game in fullscreen makes it impossible to switch back to windowed mode correctly (Windows 10) - Scaling works a bit worse, only in text mode, only in window (Linux) This implementation introduces revised user settings in sdl section - it is only partly compatible with settings from SDL 1.2; this is an issue, but it will need to be addressed in a separete commit.
This commit is contained in:
parent
3eaabb41c1
commit
a06035a35e
4 changed files with 768 additions and 972 deletions
|
@ -44,7 +44,8 @@ enum {
|
|||
CLR_WHITE=2,
|
||||
CLR_RED=3,
|
||||
CLR_BLUE=4,
|
||||
CLR_GREEN=5
|
||||
CLR_GREEN=5,
|
||||
CLR_LAST=6
|
||||
};
|
||||
|
||||
enum BB_Types {
|
||||
|
@ -67,7 +68,8 @@ enum BC_Types {
|
|||
|
||||
#define MAXSTICKS 8
|
||||
#define MAXACTIVE 16
|
||||
#define MAXBUTTON 32
|
||||
// Use 36 for Android (KEYCODE_BUTTON_1..16 are mapped to SDL buttons 20..35)
|
||||
#define MAXBUTTON 36
|
||||
#define MAXBUTTON_CAP 16
|
||||
|
||||
class CEvent;
|
||||
|
@ -298,194 +300,22 @@ protected:
|
|||
|
||||
};
|
||||
|
||||
|
||||
#define MAX_SDLKEYS 323
|
||||
|
||||
static bool usescancodes;
|
||||
static Bit8u scancode_map[MAX_SDLKEYS];
|
||||
|
||||
#define Z SDLK_UNKNOWN
|
||||
|
||||
#if defined (MACOSX)
|
||||
static SDLKey sdlkey_map[]={
|
||||
/* Main block printables */
|
||||
/*00-05*/ SDLK_a, SDLK_s, SDLK_d, SDLK_f, SDLK_h, SDLK_g,
|
||||
/*06-0B*/ SDLK_z, SDLK_x, SDLK_c, SDLK_v, SDLK_WORLD_0, SDLK_b,
|
||||
/*0C-11*/ SDLK_q, SDLK_w, SDLK_e, SDLK_r, SDLK_y, SDLK_t,
|
||||
/*12-17*/ SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_6, SDLK_5,
|
||||
/*18-1D*/ SDLK_EQUALS, SDLK_9, SDLK_7, SDLK_MINUS, SDLK_8, SDLK_0,
|
||||
/*1E-21*/ SDLK_RIGHTBRACKET, SDLK_o, SDLK_u, SDLK_LEFTBRACKET,
|
||||
/*22-23*/ SDLK_i, SDLK_p,
|
||||
/*24-29*/ SDLK_RETURN, SDLK_l, SDLK_j, SDLK_QUOTE, SDLK_k, SDLK_SEMICOLON,
|
||||
/*2A-29*/ SDLK_BACKSLASH, SDLK_COMMA, SDLK_SLASH, SDLK_n, SDLK_m,
|
||||
/*2F-2F*/ SDLK_PERIOD,
|
||||
|
||||
/* Spaces, controls, modifiers (dosbox uses LMETA only for
|
||||
* hotkeys, it's not really mapped to an emulated key) */
|
||||
/*30-33*/ SDLK_TAB, SDLK_SPACE, SDLK_BACKQUOTE, SDLK_BACKSPACE,
|
||||
/*34-37*/ Z, SDLK_ESCAPE, Z, SDLK_LMETA,
|
||||
/*38-3B*/ SDLK_LSHIFT, SDLK_CAPSLOCK, SDLK_LALT, SDLK_LCTRL,
|
||||
|
||||
/*3C-40*/ Z, Z, Z, Z, Z,
|
||||
|
||||
/* Keypad (KP_EQUALS not supported, NUMLOCK used on what is CLEAR
|
||||
* in Mac OS X) */
|
||||
/*41-46*/ SDLK_KP_PERIOD, Z, SDLK_KP_MULTIPLY, Z, SDLK_KP_PLUS, Z,
|
||||
/*47-4A*/ SDLK_NUMLOCK /*==SDLK_CLEAR*/, Z, Z, Z,
|
||||
/*4B-4D*/ SDLK_KP_DIVIDE, SDLK_KP_ENTER, Z,
|
||||
/*4E-51*/ SDLK_KP_MINUS, Z, Z, SDLK_KP_EQUALS,
|
||||
/*52-57*/ SDLK_KP0, SDLK_KP1, SDLK_KP2, SDLK_KP3, SDLK_KP4, SDLK_KP5,
|
||||
/*58-5C*/ SDLK_KP6, SDLK_KP7, Z, SDLK_KP8, SDLK_KP9,
|
||||
|
||||
/*5D-5F*/ Z, Z, Z,
|
||||
|
||||
/* Function keys and cursor blocks (F13 not supported, F14 =>
|
||||
* PRINT[SCREEN], F15 => SCROLLOCK, F16 => PAUSE, HELP => INSERT) */
|
||||
/*60-64*/ SDLK_F5, SDLK_F6, SDLK_F7, SDLK_F3, SDLK_F8,
|
||||
/*65-6A*/ SDLK_F9, Z, SDLK_F11, Z, SDLK_F13, SDLK_PAUSE /*==SDLK_F16*/,
|
||||
/*6B-70*/ SDLK_PRINT /*==SDLK_F14*/, Z, SDLK_F10, Z, SDLK_F12, Z,
|
||||
/*71-72*/ SDLK_SCROLLOCK /*==SDLK_F15*/, SDLK_INSERT /*==SDLK_HELP*/,
|
||||
/*73-77*/ SDLK_HOME, SDLK_PAGEUP, SDLK_DELETE, SDLK_F4, SDLK_END,
|
||||
/*78-7C*/ SDLK_F2, SDLK_PAGEDOWN, SDLK_F1, SDLK_LEFT, SDLK_RIGHT,
|
||||
/*7D-7E*/ SDLK_DOWN, SDLK_UP,
|
||||
|
||||
/*7F-7F*/ Z,
|
||||
|
||||
/* 4 extra keys that don't really exist, but are needed for
|
||||
* round-trip mapping (dosbox uses RMETA only for hotkeys, it's
|
||||
* not really mapped to an emulated key) */
|
||||
SDLK_RMETA, SDLK_RSHIFT, SDLK_RALT, SDLK_RCTRL
|
||||
};
|
||||
#define MAX_SCANCODES (0x80+4)
|
||||
/* Make sure that the table above has the expected size. This
|
||||
expression will raise a compiler error if the condition is false. */
|
||||
typedef char assert_right_size [MAX_SCANCODES == (sizeof(sdlkey_map)/sizeof(sdlkey_map[0])) ? 1 : -1];
|
||||
|
||||
#else // !MACOSX
|
||||
|
||||
#define MAX_SCANCODES 0xdf
|
||||
static SDLKey sdlkey_map[MAX_SCANCODES]={SDLK_UNKNOWN,SDLK_ESCAPE,
|
||||
SDLK_1,SDLK_2,SDLK_3,SDLK_4,SDLK_5,SDLK_6,SDLK_7,SDLK_8,SDLK_9,SDLK_0,
|
||||
/* 0x0c: */
|
||||
SDLK_MINUS,SDLK_EQUALS,SDLK_BACKSPACE,SDLK_TAB,
|
||||
SDLK_q,SDLK_w,SDLK_e,SDLK_r,SDLK_t,SDLK_y,SDLK_u,SDLK_i,SDLK_o,SDLK_p,
|
||||
SDLK_LEFTBRACKET,SDLK_RIGHTBRACKET,SDLK_RETURN,SDLK_LCTRL,
|
||||
SDLK_a,SDLK_s,SDLK_d,SDLK_f,SDLK_g,SDLK_h,SDLK_j,SDLK_k,SDLK_l,
|
||||
SDLK_SEMICOLON,SDLK_QUOTE,SDLK_BACKQUOTE,SDLK_LSHIFT,SDLK_BACKSLASH,
|
||||
SDLK_z,SDLK_x,SDLK_c,SDLK_v,SDLK_b,SDLK_n,SDLK_m,
|
||||
/* 0x33: */
|
||||
SDLK_COMMA,SDLK_PERIOD,SDLK_SLASH,SDLK_RSHIFT,SDLK_KP_MULTIPLY,
|
||||
SDLK_LALT,SDLK_SPACE,SDLK_CAPSLOCK,
|
||||
SDLK_F1,SDLK_F2,SDLK_F3,SDLK_F4,SDLK_F5,SDLK_F6,SDLK_F7,SDLK_F8,SDLK_F9,SDLK_F10,
|
||||
/* 0x45: */
|
||||
SDLK_NUMLOCK,SDLK_SCROLLOCK,
|
||||
SDLK_KP7,SDLK_KP8,SDLK_KP9,SDLK_KP_MINUS,SDLK_KP4,SDLK_KP5,SDLK_KP6,SDLK_KP_PLUS,
|
||||
SDLK_KP1,SDLK_KP2,SDLK_KP3,SDLK_KP0,SDLK_KP_PERIOD,
|
||||
SDLK_UNKNOWN,SDLK_UNKNOWN,
|
||||
SDLK_LESS,SDLK_F11,SDLK_F12, Z, Z, Z, Z, Z, Z, Z,
|
||||
/* 0x60: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0x70: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0x80: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0x90: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0xA0: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0xB0: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0xC0: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0xD0: */
|
||||
Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z//,Z,Z,
|
||||
/* 0xE0: */
|
||||
//Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z,
|
||||
/* 0xF0: */
|
||||
// Z,Z,Z,Z, Z,Z,Z,Z, Z,Z,Z,Z, Z,Z//,Z,Z
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
#undef Z
|
||||
|
||||
|
||||
SDLKey MapSDLCode(Bitu skey) {
|
||||
// LOG_MSG("MapSDLCode %d %X",skey,skey);
|
||||
if (usescancodes) {
|
||||
if (skey<MAX_SCANCODES) return sdlkey_map[skey];
|
||||
else return SDLK_UNKNOWN;
|
||||
} else return (SDLKey)skey;
|
||||
}
|
||||
|
||||
Bitu GetKeyCode(SDL_keysym keysym) {
|
||||
// LOG_MSG("GetKeyCode %X %X %X",keysym.scancode,keysym.sym,keysym.mod);
|
||||
if (usescancodes) {
|
||||
Bitu key=(Bitu)keysym.scancode;
|
||||
if (key==0
|
||||
#if defined (MACOSX)
|
||||
/* On Mac on US keyboards, scancode 0 is actually the 'a'
|
||||
* key. For good measure exclude all printables from this
|
||||
* condition. */
|
||||
&& (keysym.sym < SDLK_SPACE || keysym.sym > SDLK_WORLD_95)
|
||||
#endif
|
||||
) {
|
||||
/* try to retrieve key from symbolic key as scancode is zero */
|
||||
if (keysym.sym<MAX_SDLKEYS) key=scancode_map[(Bitu)keysym.sym];
|
||||
}
|
||||
#if !defined (WIN32) && !defined (MACOSX)
|
||||
/* Linux adds 8 to all scancodes */
|
||||
else key-=8;
|
||||
#endif
|
||||
#if defined (WIN32)
|
||||
switch (key) {
|
||||
case 0x1c: // ENTER
|
||||
case 0x1d: // CONTROL
|
||||
case 0x35: // SLASH
|
||||
case 0x37: // PRINTSCREEN
|
||||
case 0x38: // ALT
|
||||
case 0x45: // PAUSE
|
||||
case 0x47: // HOME
|
||||
case 0x48: // cursor UP
|
||||
case 0x49: // PAGE UP
|
||||
case 0x4b: // cursor LEFT
|
||||
case 0x4d: // cursor RIGHT
|
||||
case 0x4f: // END
|
||||
case 0x50: // cursor DOWN
|
||||
case 0x51: // PAGE DOWN
|
||||
case 0x52: // INSERT
|
||||
case 0x53: // DELETE
|
||||
if (GFX_SDLUsingWinDIB()) key=scancode_map[(Bitu)keysym.sym];
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return key;
|
||||
} else {
|
||||
#if defined (WIN32)
|
||||
/* special handling of 102-key under windows */
|
||||
if ((keysym.sym==SDLK_BACKSLASH) && (keysym.scancode==0x56)) return (Bitu)SDLK_LESS;
|
||||
#endif
|
||||
return (Bitu)keysym.sym;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CKeyBind;
|
||||
class CKeyBindGroup;
|
||||
|
||||
class CKeyBind : public CBind {
|
||||
public:
|
||||
CKeyBind(CBindList * _list,SDLKey _key) : CBind(_list) {
|
||||
CKeyBind(CBindList * _list,SDL_Scancode _key) : CBind(_list) {
|
||||
key = _key;
|
||||
}
|
||||
void BindName(char * buf) {
|
||||
sprintf(buf,"Key %s",SDL_GetKeyName(MapSDLCode((Bitu)key)));
|
||||
sprintf(buf,"Key %s",SDL_GetScancodeName(key));
|
||||
}
|
||||
void ConfigName(char * buf) {
|
||||
sprintf(buf,"key %d",MapSDLCode((Bitu)key));
|
||||
sprintf(buf,"key %d",key);
|
||||
}
|
||||
public:
|
||||
SDLKey key;
|
||||
SDL_Scancode key;
|
||||
};
|
||||
|
||||
class CKeyBindGroup : public CBindGroup {
|
||||
|
@ -501,28 +331,21 @@ public:
|
|||
if (strncasecmp(buf,configname,strlen(configname))) return 0;
|
||||
StripWord(buf);char * num=StripWord(buf);
|
||||
Bitu code=ConvDecWord(num);
|
||||
if (usescancodes) {
|
||||
if (code<MAX_SDLKEYS) code=scancode_map[code];
|
||||
else code=0;
|
||||
}
|
||||
CBind * bind=CreateKeyBind((SDLKey)code);
|
||||
CBind * bind=CreateKeyBind((SDL_Scancode)code);
|
||||
return bind;
|
||||
}
|
||||
CBind * CreateEventBind(SDL_Event * event) {
|
||||
if (event->type!=SDL_KEYDOWN) return 0;
|
||||
return CreateKeyBind((SDLKey)GetKeyCode(event->key.keysym));
|
||||
return CreateKeyBind(event->key.keysym.scancode);
|
||||
};
|
||||
bool CheckEvent(SDL_Event * event) {
|
||||
if (event->type!=SDL_KEYDOWN && event->type!=SDL_KEYUP) return false;
|
||||
Bitu key=GetKeyCode(event->key.keysym);
|
||||
// LOG_MSG("key type %i is %x [%x %x]",event->type,key,event->key.keysym.sym,event->key.keysym.scancode);
|
||||
assert(Bitu(event->key.keysym.sym)<keys);
|
||||
Bitu key = event->key.keysym.scancode;
|
||||
if (event->type==SDL_KEYDOWN) ActivateBindList(&lists[key],0x7fff,true);
|
||||
else DeactivateBindList(&lists[key],true);
|
||||
return 0;
|
||||
}
|
||||
CBind * CreateKeyBind(SDLKey _key) {
|
||||
if (!usescancodes) assert((Bitu)_key<keys);
|
||||
CBind * CreateKeyBind(SDL_Scancode _key) {
|
||||
return new CKeyBind(&lists[(Bitu)_key],_key);
|
||||
}
|
||||
private:
|
||||
|
@ -675,7 +498,7 @@ public:
|
|||
if (axes_cap>axes) axes_cap=axes;
|
||||
hats_cap=emulated_hats;
|
||||
if (hats_cap>hats) hats_cap=hats;
|
||||
LOG_MSG("Using joystick %s with %d axes, %d buttons and %d hat(s)",SDL_JoystickName(stick),axes,buttons,hats);
|
||||
LOG_MSG("Using joystick %s with %d axes, %d buttons and %d hat(s)",SDL_JoystickNameForIndex(stick),axes,buttons,hats);
|
||||
}
|
||||
~CStickBindGroup() {
|
||||
SDL_JoystickClose(sdl_joystick);
|
||||
|
@ -881,7 +704,7 @@ private:
|
|||
return configname;
|
||||
}
|
||||
const char * BindStart(void) {
|
||||
if (sdl_joystick!=NULL) return SDL_JoystickName(stick);
|
||||
if (sdl_joystick!=NULL) return SDL_JoystickNameForIndex(stick);
|
||||
else return "[missing joystick]";
|
||||
}
|
||||
|
||||
|
@ -1240,6 +1063,9 @@ protected:
|
|||
};
|
||||
|
||||
static struct CMapper {
|
||||
SDL_Window * window;
|
||||
SDL_Rect draw_rect;
|
||||
SDL_Surface * draw_surface_nonpaletted; // Needed for SDL_BlitScaled
|
||||
SDL_Surface * surface;
|
||||
SDL_Surface * draw_surface;
|
||||
bool exit;
|
||||
|
@ -1277,7 +1103,7 @@ void CBindGroup::DeactivateBindList(CBindList * list,bool ev_trigger) {
|
|||
}
|
||||
|
||||
static void DrawText(Bitu x,Bitu y,const char * text,Bit8u color) {
|
||||
Bit8u * draw=((Bit8u *)mapper.surface->pixels)+(y*mapper.surface->pitch)+x;
|
||||
Bit8u * draw=((Bit8u *)mapper.draw_surface->pixels)+(y*mapper.draw_surface->w)+x;
|
||||
while (*text) {
|
||||
Bit8u * font=&int10_font_14[(*text)*14];
|
||||
Bitu i,j;Bit8u * draw_line=draw;
|
||||
|
@ -1288,7 +1114,7 @@ static void DrawText(Bitu x,Bitu y,const char * text,Bit8u color) {
|
|||
else *(draw_line+j)=CLR_BLACK;
|
||||
map<<=1;
|
||||
}
|
||||
draw_line+=mapper.surface->pitch;
|
||||
draw_line+=mapper.draw_surface->w;
|
||||
}
|
||||
text++;draw+=8;
|
||||
}
|
||||
|
@ -1305,14 +1131,14 @@ public:
|
|||
}
|
||||
virtual void Draw(void) {
|
||||
if (!enabled) return;
|
||||
Bit8u * point=((Bit8u *)mapper.surface->pixels)+(y*mapper.surface->pitch)+x;
|
||||
Bit8u * point=((Bit8u *)mapper.draw_surface->pixels)+(y*mapper.draw_surface->w)+x;
|
||||
for (Bitu lines=0;lines<dy;lines++) {
|
||||
if (lines==0 || lines==(dy-1)) {
|
||||
for (Bitu cols=0;cols<dx;cols++) *(point+cols)=color;
|
||||
} else {
|
||||
*point=color;*(point+dx-1)=color;
|
||||
}
|
||||
point+=mapper.surface->pitch;
|
||||
point+=mapper.draw_surface->w;
|
||||
}
|
||||
}
|
||||
virtual bool OnTop(Bitu _x,Bitu _y) {
|
||||
|
@ -1343,13 +1169,21 @@ protected:
|
|||
const char * text;
|
||||
};
|
||||
|
||||
class CClickableTextButton : public CTextButton {
|
||||
public:
|
||||
CClickableTextButton(Bitu _x,Bitu _y,Bitu _dx,Bitu _dy,const char * _text) : CTextButton(_x,_y,_dx,_dy,_text) {}
|
||||
void BindColor(void) {
|
||||
this->SetColor(CLR_WHITE);
|
||||
}
|
||||
};
|
||||
|
||||
class CEventButton;
|
||||
static CEventButton * last_clicked = NULL;
|
||||
|
||||
class CEventButton : public CTextButton {
|
||||
class CEventButton : public CClickableTextButton {
|
||||
public:
|
||||
CEventButton(Bitu _x,Bitu _y,Bitu _dx,Bitu _dy,const char * _text,CEvent * _event)
|
||||
: CTextButton(_x,_y,_dx,_dy,_text) {
|
||||
: CClickableTextButton(_x,_y,_dx,_dy,_text) {
|
||||
event=_event;
|
||||
}
|
||||
void BindColor(void) {
|
||||
|
@ -1391,10 +1225,10 @@ void CCaptionButton::Change(const char * format,...) {
|
|||
static void change_action_text(const char* text,Bit8u col);
|
||||
|
||||
static void MAPPER_SaveBinds(void);
|
||||
class CBindButton : public CTextButton {
|
||||
class CBindButton : public CClickableTextButton {
|
||||
public:
|
||||
CBindButton(Bitu _x,Bitu _y,Bitu _dx,Bitu _dy,const char * _text,BB_Types _type)
|
||||
: CTextButton(_x,_y,_dx,_dy,_text) {
|
||||
: CClickableTextButton(_x,_y,_dx,_dy,_text) {
|
||||
type=_type;
|
||||
}
|
||||
void Click(void) {
|
||||
|
@ -1433,10 +1267,10 @@ protected:
|
|||
BB_Types type;
|
||||
};
|
||||
|
||||
class CCheckButton : public CTextButton {
|
||||
class CCheckButton : public CClickableTextButton {
|
||||
public:
|
||||
CCheckButton(Bitu _x,Bitu _y,Bitu _dx,Bitu _dy,const char * _text,BC_Types _type)
|
||||
: CTextButton(_x,_y,_dx,_dy,_text) {
|
||||
: CClickableTextButton(_x,_y,_dx,_dy,_text) {
|
||||
type=_type;
|
||||
}
|
||||
void Draw(void) {
|
||||
|
@ -1457,13 +1291,13 @@ public:
|
|||
break;
|
||||
}
|
||||
if (checked) {
|
||||
Bit8u * point=((Bit8u *)mapper.surface->pixels)+((y+2)*mapper.surface->pitch)+x+dx-dy+2;
|
||||
Bit8u * point=((Bit8u *)mapper.draw_surface->pixels)+((y+2)*mapper.draw_surface->w)+x+dx-dy+2;
|
||||
for (Bitu lines=0;lines<(dy-4);lines++) {
|
||||
memset(point,color,dy-4);
|
||||
point+=mapper.surface->pitch;
|
||||
point+=mapper.draw_surface->w;
|
||||
}
|
||||
}
|
||||
CTextButton::Draw();
|
||||
CClickableTextButton::Draw();
|
||||
}
|
||||
void Click(void) {
|
||||
switch (type) {
|
||||
|
@ -1589,25 +1423,25 @@ public:
|
|||
case MK_f1:case MK_f2:case MK_f3:case MK_f4:
|
||||
case MK_f5:case MK_f6:case MK_f7:case MK_f8:
|
||||
case MK_f9:case MK_f10:case MK_f11:case MK_f12:
|
||||
key=SDLK_F1+(defkey-MK_f1);
|
||||
key=SDL_SCANCODE_F1+(defkey-MK_f1);
|
||||
break;
|
||||
case MK_return:
|
||||
key=SDLK_RETURN;
|
||||
key=SDL_SCANCODE_RETURN;
|
||||
break;
|
||||
case MK_kpminus:
|
||||
key=SDLK_KP_MINUS;
|
||||
key=SDL_SCANCODE_KP_MINUS;
|
||||
break;
|
||||
case MK_scrolllock:
|
||||
key=SDLK_SCROLLOCK;
|
||||
key=SDL_SCANCODE_SCROLLLOCK;
|
||||
break;
|
||||
case MK_pause:
|
||||
key=SDLK_PAUSE;
|
||||
key=SDL_SCANCODE_PAUSE;
|
||||
break;
|
||||
case MK_printscreen:
|
||||
key=SDLK_PRINT;
|
||||
key=SDL_SCANCODE_PRINTSCREEN;
|
||||
break;
|
||||
case MK_home:
|
||||
key=SDLK_HOME;
|
||||
key=SDL_SCANCODE_HOME;
|
||||
break;
|
||||
}
|
||||
sprintf(buf,"%s \"key %d%s%s%s\"",
|
||||
|
@ -1689,14 +1523,20 @@ static void SetActiveEvent(CEvent * event) {
|
|||
}
|
||||
}
|
||||
|
||||
extern SDL_Window * GFX_SetSDLSurfaceWindow(Bit16u width, Bit16u height);
|
||||
extern SDL_Rect GFX_GetSDLSurfaceSubwindowDims(Bit16u width, Bit16u height);
|
||||
extern void GFX_UpdateDisplayDimensions(int width, int height);
|
||||
|
||||
static void DrawButtons(void) {
|
||||
SDL_FillRect(mapper.surface,0,CLR_BLACK);
|
||||
SDL_LockSurface(mapper.surface);
|
||||
SDL_FillRect(mapper.draw_surface,0,CLR_BLACK);
|
||||
for (CButton_it but_it = buttons.begin();but_it!=buttons.end();but_it++) {
|
||||
(*but_it)->Draw();
|
||||
}
|
||||
SDL_UnlockSurface(mapper.surface);
|
||||
SDL_Flip(mapper.surface);
|
||||
// We can't just use SDL_BlitScaled (say for Android) in one step
|
||||
SDL_BlitSurface(mapper.draw_surface, NULL, mapper.draw_surface_nonpaletted, NULL);
|
||||
SDL_BlitScaled(mapper.draw_surface_nonpaletted, NULL, mapper.surface, &mapper.draw_rect);
|
||||
//SDL_BlitSurface(mapper.draw_surface, NULL, mapper.surface, NULL);
|
||||
SDL_UpdateWindowSurface(mapper.window);
|
||||
}
|
||||
|
||||
static CKeyEvent * AddKeyButtonEvent(Bitu x,Bitu y,Bitu dx,Bitu dy,char const * const title,char const * const entry,KBD_KEYS key) {
|
||||
|
@ -2003,7 +1843,7 @@ static void CreateLayout(void) {
|
|||
bind_but.bind_title->Change("Bind Title");
|
||||
}
|
||||
|
||||
static SDL_Color map_pal[6]={
|
||||
static SDL_Color map_pal[CLR_LAST]={
|
||||
{0x00,0x00,0x00,0x00}, //0=black
|
||||
{0x7f,0x7f,0x7f,0x00}, //1=grey
|
||||
{0xff,0xff,0xff,0x00}, //2=white
|
||||
|
@ -2042,46 +1882,44 @@ static struct {
|
|||
const char * eventend;
|
||||
Bitu key;
|
||||
} DefaultKeys[]={
|
||||
{"f1",SDLK_F1}, {"f2",SDLK_F2}, {"f3",SDLK_F3}, {"f4",SDLK_F4},
|
||||
{"f5",SDLK_F5}, {"f6",SDLK_F6}, {"f7",SDLK_F7}, {"f8",SDLK_F8},
|
||||
{"f9",SDLK_F9}, {"f10",SDLK_F10}, {"f11",SDLK_F11}, {"f12",SDLK_F12},
|
||||
|
||||
{"1",SDLK_1}, {"2",SDLK_2}, {"3",SDLK_3}, {"4",SDLK_4},
|
||||
{"5",SDLK_5}, {"6",SDLK_6}, {"7",SDLK_7}, {"8",SDLK_8},
|
||||
{"9",SDLK_9}, {"0",SDLK_0},
|
||||
{"f1",SDL_SCANCODE_F1}, {"f2",SDL_SCANCODE_F2}, {"f3",SDL_SCANCODE_F3}, {"f4",SDL_SCANCODE_F4},
|
||||
{"f5",SDL_SCANCODE_F5}, {"f6",SDL_SCANCODE_F6}, {"f7",SDL_SCANCODE_F7}, {"f8",SDL_SCANCODE_F8},
|
||||
{"f9",SDL_SCANCODE_F9}, {"f10",SDL_SCANCODE_F10}, {"f11",SDL_SCANCODE_F11}, {"f12",SDL_SCANCODE_F12},
|
||||
|
||||
{"a",SDLK_a}, {"b",SDLK_b}, {"c",SDLK_c}, {"d",SDLK_d},
|
||||
{"e",SDLK_e}, {"f",SDLK_f}, {"g",SDLK_g}, {"h",SDLK_h},
|
||||
{"i",SDLK_i}, {"j",SDLK_j}, {"k",SDLK_k}, {"l",SDLK_l},
|
||||
{"m",SDLK_m}, {"n",SDLK_n}, {"o",SDLK_o}, {"p",SDLK_p},
|
||||
{"q",SDLK_q}, {"r",SDLK_r}, {"s",SDLK_s}, {"t",SDLK_t},
|
||||
{"u",SDLK_u}, {"v",SDLK_v}, {"w",SDLK_w}, {"x",SDLK_x},
|
||||
{"y",SDLK_y}, {"z",SDLK_z}, {"space",SDLK_SPACE},
|
||||
{"esc",SDLK_ESCAPE}, {"equals",SDLK_EQUALS}, {"grave",SDLK_BACKQUOTE},
|
||||
{"tab",SDLK_TAB}, {"enter",SDLK_RETURN}, {"bspace",SDLK_BACKSPACE},
|
||||
{"lbracket",SDLK_LEFTBRACKET}, {"rbracket",SDLK_RIGHTBRACKET},
|
||||
{"minus",SDLK_MINUS}, {"capslock",SDLK_CAPSLOCK}, {"semicolon",SDLK_SEMICOLON},
|
||||
{"quote", SDLK_QUOTE}, {"backslash",SDLK_BACKSLASH}, {"lshift",SDLK_LSHIFT},
|
||||
{"rshift",SDLK_RSHIFT}, {"lalt",SDLK_LALT}, {"ralt",SDLK_RALT},
|
||||
{"lctrl",SDLK_LCTRL}, {"rctrl",SDLK_RCTRL}, {"comma",SDLK_COMMA},
|
||||
{"period",SDLK_PERIOD}, {"slash",SDLK_SLASH}, {"printscreen",SDLK_PRINT},
|
||||
{"scrolllock",SDLK_SCROLLOCK}, {"pause",SDLK_PAUSE}, {"pagedown",SDLK_PAGEDOWN},
|
||||
{"pageup",SDLK_PAGEUP}, {"insert",SDLK_INSERT}, {"home",SDLK_HOME},
|
||||
{"delete",SDLK_DELETE}, {"end",SDLK_END}, {"up",SDLK_UP},
|
||||
{"left",SDLK_LEFT}, {"down",SDLK_DOWN}, {"right",SDLK_RIGHT},
|
||||
{"kp_0",SDLK_KP0}, {"kp_1",SDLK_KP1}, {"kp_2",SDLK_KP2}, {"kp_3",SDLK_KP3},
|
||||
{"kp_4",SDLK_KP4}, {"kp_5",SDLK_KP5}, {"kp_6",SDLK_KP6}, {"kp_7",SDLK_KP7},
|
||||
{"kp_8",SDLK_KP8}, {"kp_9",SDLK_KP9}, {"numlock",SDLK_NUMLOCK},
|
||||
{"kp_divide",SDLK_KP_DIVIDE}, {"kp_multiply",SDLK_KP_MULTIPLY},
|
||||
{"kp_minus",SDLK_KP_MINUS}, {"kp_plus",SDLK_KP_PLUS},
|
||||
{"kp_period",SDLK_KP_PERIOD}, {"kp_enter",SDLK_KP_ENTER},
|
||||
{"1",SDL_SCANCODE_1}, {"2",SDL_SCANCODE_2}, {"3",SDL_SCANCODE_3}, {"4",SDL_SCANCODE_4},
|
||||
{"5",SDL_SCANCODE_5}, {"6",SDL_SCANCODE_6}, {"7",SDL_SCANCODE_7}, {"8",SDL_SCANCODE_8},
|
||||
{"9",SDL_SCANCODE_9}, {"0",SDL_SCANCODE_0},
|
||||
|
||||
#if defined (MACOSX)
|
||||
/* Intl Mac keyboards in US layout actually put U+00A7 SECTION SIGN here */
|
||||
{"lessthan",SDLK_WORLD_0},
|
||||
#else
|
||||
{"lessthan",SDLK_LESS},
|
||||
#endif
|
||||
{"a",SDL_SCANCODE_A}, {"b",SDL_SCANCODE_B}, {"c",SDL_SCANCODE_C}, {"d",SDL_SCANCODE_D},
|
||||
{"e",SDL_SCANCODE_E}, {"f",SDL_SCANCODE_F}, {"g",SDL_SCANCODE_G}, {"h",SDL_SCANCODE_H},
|
||||
{"i",SDL_SCANCODE_I}, {"j",SDL_SCANCODE_J}, {"k",SDL_SCANCODE_K}, {"l",SDL_SCANCODE_L},
|
||||
{"m",SDL_SCANCODE_M}, {"n",SDL_SCANCODE_N}, {"o",SDL_SCANCODE_O}, {"p",SDL_SCANCODE_P},
|
||||
{"q",SDL_SCANCODE_Q}, {"r",SDL_SCANCODE_R}, {"s",SDL_SCANCODE_S}, {"t",SDL_SCANCODE_T},
|
||||
{"u",SDL_SCANCODE_U}, {"v",SDL_SCANCODE_V}, {"w",SDL_SCANCODE_W}, {"x",SDL_SCANCODE_X},
|
||||
{"y",SDL_SCANCODE_Y}, {"z",SDL_SCANCODE_Z}, {"space",SDL_SCANCODE_SPACE},
|
||||
{"esc",SDL_SCANCODE_ESCAPE}, {"equals",SDL_SCANCODE_EQUALS}, {"grave",SDL_SCANCODE_GRAVE},
|
||||
{"tab",SDL_SCANCODE_TAB}, {"enter",SDL_SCANCODE_RETURN}, {"bspace",SDL_SCANCODE_BACKSPACE},
|
||||
{"lbracket",SDL_SCANCODE_LEFTBRACKET}, {"rbracket",SDL_SCANCODE_RIGHTBRACKET},
|
||||
{"minus",SDL_SCANCODE_MINUS}, {"capslock",SDL_SCANCODE_CAPSLOCK}, {"semicolon",SDL_SCANCODE_SEMICOLON},
|
||||
{"quote", SDL_SCANCODE_APOSTROPHE}, {"backslash",SDL_SCANCODE_BACKSLASH}, {"lshift",SDL_SCANCODE_LSHIFT},
|
||||
{"rshift",SDL_SCANCODE_RSHIFT}, {"lalt",SDL_SCANCODE_LALT}, {"ralt",SDL_SCANCODE_RALT},
|
||||
{"lctrl",SDL_SCANCODE_LCTRL}, {"rctrl",SDL_SCANCODE_RCTRL}, {"comma",SDL_SCANCODE_COMMA},
|
||||
{"period",SDL_SCANCODE_PERIOD}, {"slash",SDL_SCANCODE_SLASH}, {"printscreen",SDL_SCANCODE_PRINTSCREEN},
|
||||
{"scrolllock",SDL_SCANCODE_SCROLLLOCK}, {"pause",SDL_SCANCODE_PAUSE}, {"pagedown",SDL_SCANCODE_PAGEDOWN},
|
||||
{"pageup",SDL_SCANCODE_PAGEUP}, {"insert",SDL_SCANCODE_INSERT}, {"home",SDL_SCANCODE_HOME},
|
||||
{"delete",SDL_SCANCODE_DELETE}, {"end",SDL_SCANCODE_END}, {"up",SDL_SCANCODE_UP},
|
||||
{"left",SDL_SCANCODE_LEFT}, {"down",SDL_SCANCODE_DOWN}, {"right",SDL_SCANCODE_RIGHT},
|
||||
{"kp_0",SDL_SCANCODE_KP_0}, {"kp_1",SDL_SCANCODE_KP_1}, {"kp_2",SDL_SCANCODE_KP_2}, {"kp_3",SDL_SCANCODE_KP_3},
|
||||
{"kp_4",SDL_SCANCODE_KP_4}, {"kp_5",SDL_SCANCODE_KP_5}, {"kp_6",SDL_SCANCODE_KP_6}, {"kp_7",SDL_SCANCODE_KP_7},
|
||||
{"kp_8",SDL_SCANCODE_KP_8}, {"kp_9",SDL_SCANCODE_KP_9}, {"numlock",SDL_SCANCODE_NUMLOCKCLEAR},
|
||||
{"kp_divide",SDL_SCANCODE_KP_DIVIDE}, {"kp_multiply",SDL_SCANCODE_KP_MULTIPLY},
|
||||
{"kp_minus",SDL_SCANCODE_KP_MINUS}, {"kp_plus",SDL_SCANCODE_KP_PLUS},
|
||||
{"kp_period",SDL_SCANCODE_KP_PERIOD}, {"kp_enter",SDL_SCANCODE_KP_ENTER},
|
||||
|
||||
/* Is that the extra backslash key ("less than" key) */
|
||||
/* on some keyboards with the 102-keys layout?? */
|
||||
{"lessthan",SDL_SCANCODE_NONUSBACKSLASH},
|
||||
|
||||
{0,0}
|
||||
};
|
||||
|
@ -2094,10 +1932,10 @@ static void CreateDefaultBinds(void) {
|
|||
CreateStringBind(buffer);
|
||||
i++;
|
||||
}
|
||||
sprintf(buffer,"mod_1 \"key %d\"",SDLK_RCTRL);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_1 \"key %d\"",SDLK_LCTRL);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_2 \"key %d\"",SDLK_RALT);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_2 \"key %d\"",SDLK_LALT);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_1 \"key %d\"",SDL_SCANCODE_RCTRL);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_1 \"key %d\"",SDL_SCANCODE_LCTRL);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_2 \"key %d\"",SDL_SCANCODE_RALT);CreateStringBind(buffer);
|
||||
sprintf(buffer,"mod_2 \"key %d\"",SDL_SCANCODE_LALT);CreateStringBind(buffer);
|
||||
for (CHandlerEventVector_it hit=handlergroup.begin();hit!=handlergroup.end();hit++) {
|
||||
(*hit)->MakeDefaultBind(buffer);
|
||||
CreateStringBind(buffer);
|
||||
|
@ -2190,17 +2028,86 @@ void MAPPER_CheckEvent(SDL_Event * event) {
|
|||
|
||||
void BIND_MappingEvents(void) {
|
||||
SDL_Event event;
|
||||
static bool isButtonPressed = false;
|
||||
static CButton *lastHoveredButton = NULL;
|
||||
while (SDL_PollEvent(&event)) {
|
||||
switch (event.type) {
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
isButtonPressed = true;
|
||||
/* Further check where are we pointing at right now */
|
||||
case SDL_MOUSEMOTION:
|
||||
if (!isButtonPressed)
|
||||
break;
|
||||
/* Normalize position in case a scaled sub-window is used (say on Android) */
|
||||
event.button.x=(event.button.x-mapper.draw_rect.x)*mapper.draw_surface->w/mapper.draw_rect.w;
|
||||
if ((event.button.x<0) || (event.button.x>=mapper.draw_surface->w))
|
||||
break;
|
||||
event.button.y=(event.button.y-mapper.draw_rect.y)*mapper.draw_surface->h/mapper.draw_rect.h;
|
||||
if ((event.button.y<0) || (event.button.y>=mapper.draw_surface->h))
|
||||
break;
|
||||
/* Maybe we have been pointing at a specific button for a little while */
|
||||
if (lastHoveredButton) {
|
||||
/* Check if there's any change */
|
||||
if (lastHoveredButton->OnTop(event.button.x,event.button.y))
|
||||
break;
|
||||
/* Not pointing at given button anymore */
|
||||
if (lastHoveredButton == last_clicked)
|
||||
lastHoveredButton->Click();
|
||||
else
|
||||
lastHoveredButton->BindColor();
|
||||
mapper.redraw=true;
|
||||
lastHoveredButton=NULL;
|
||||
}
|
||||
/* Check which button are we currently pointing at */
|
||||
for (CButton_it but_it = buttons.begin();but_it!=buttons.end();but_it++) {
|
||||
if (dynamic_cast<CClickableTextButton *>(*but_it) && (*but_it)->OnTop(event.button.x,event.button.y)) {
|
||||
(*but_it)->SetColor(CLR_RED);
|
||||
mapper.redraw=true;
|
||||
lastHoveredButton=*but_it;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
isButtonPressed = false;
|
||||
if (lastHoveredButton) {
|
||||
/* For most buttons the actual new color is going to be green; But not for a few others. */
|
||||
lastHoveredButton->BindColor();
|
||||
mapper.redraw=true;
|
||||
lastHoveredButton = NULL;
|
||||
}
|
||||
/* Normalize position in case a scaled sub-window is used (say on Android) */
|
||||
event.button.x=(event.button.x-mapper.draw_rect.x)*mapper.draw_surface->w/mapper.draw_rect.w;
|
||||
if ((event.button.x<0) || (event.button.x>=mapper.draw_surface->w))
|
||||
break;
|
||||
event.button.y=(event.button.y-mapper.draw_rect.y)*mapper.draw_surface->h/mapper.draw_rect.h;
|
||||
if ((event.button.y<0) || (event.button.y>=mapper.draw_surface->h))
|
||||
break;
|
||||
/* Check the press */
|
||||
for (CButton_it but_it = buttons.begin();but_it!=buttons.end();but_it++) {
|
||||
if ((*but_it)->OnTop(event.button.x,event.button.y)) {
|
||||
if (dynamic_cast<CClickableTextButton *>(*but_it) && (*but_it)->OnTop(event.button.x,event.button.y)) {
|
||||
(*but_it)->Click();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SDL_WINDOWEVENT:
|
||||
/* The resize event MAY arrive e.g. when the mapper is
|
||||
* toggled, at least on X11. Furthermore, the restore
|
||||
* event should be handled on Android.
|
||||
*/
|
||||
if ((event.window.event == SDL_WINDOWEVENT_RESIZED)
|
||||
|| (event.window.event == SDL_WINDOWEVENT_RESTORED)) {
|
||||
mapper.surface = SDL_GetWindowSurface(mapper.window);
|
||||
if (mapper.surface == NULL) E_Exit("Couldn't refresh mapper window surface after resize or restoration: %s",SDL_GetError());
|
||||
GFX_UpdateDisplayDimensions(event.window.data1, event.window.data2);
|
||||
mapper.draw_rect=GFX_GetSDLSurfaceSubwindowDims(640,480);
|
||||
DrawButtons();
|
||||
}
|
||||
break;
|
||||
case SDL_QUIT:
|
||||
isButtonPressed = false;
|
||||
lastHoveredButton = NULL;
|
||||
mapper.exit=true;
|
||||
break;
|
||||
default:
|
||||
|
@ -2275,7 +2182,7 @@ static void InitializeJoysticks(void) {
|
|||
|
||||
static void CreateBindGroups(void) {
|
||||
bindgroups.clear();
|
||||
new CKeyBindGroup(SDLK_LAST);
|
||||
new CKeyBindGroup(SDL_NUM_SCANCODES);
|
||||
if (joytype != JOY_NONE) {
|
||||
#if defined (REDUCE_JOYSTICK_POLLING)
|
||||
// direct access to the SDL joystick, thus removed from the event handling
|
||||
|
@ -2358,11 +2265,20 @@ void MAPPER_RunInternal() {
|
|||
|
||||
/* Be sure that there is no update in progress */
|
||||
GFX_EndUpdate( 0 );
|
||||
mapper.surface=SDL_SetVideoMode_Wrap(640,480,8,0);
|
||||
if (mapper.surface == NULL) E_Exit("Could not initialize video mode for mapper: %s",SDL_GetError());
|
||||
mapper.window=GFX_SetSDLSurfaceWindow(640,480);
|
||||
if (mapper.window == NULL) E_Exit("Could not initialize video mode for mapper: %s",SDL_GetError());
|
||||
mapper.surface=SDL_GetWindowSurface(mapper.window);
|
||||
if (mapper.surface == NULL) E_Exit("Could not retrieve window surface for mapper: %s",SDL_GetError());
|
||||
|
||||
/* Set some palette entries */
|
||||
SDL_SetPalette(mapper.surface, SDL_LOGPAL|SDL_PHYSPAL, map_pal, 0, 6);
|
||||
mapper.draw_surface=SDL_CreateRGBSurface(0,640,480,8,0,0,0,0);
|
||||
// Needed for SDL_BlitScaled
|
||||
mapper.draw_surface_nonpaletted=SDL_CreateRGBSurface(0,640,480,32,0x0000ff00,0x00ff0000,0xff000000,0);
|
||||
mapper.draw_rect=GFX_GetSDLSurfaceSubwindowDims(640,480);
|
||||
// Sorry, but SDL_SetSurfacePalette requires a full palette.
|
||||
SDL_Palette *sdl2_map_pal_ptr = SDL_AllocPalette(256);
|
||||
SDL_SetPaletteColors(sdl2_map_pal_ptr, map_pal, 0, CLR_LAST);
|
||||
SDL_SetSurfacePalette(mapper.draw_surface, sdl2_map_pal_ptr);
|
||||
if (last_clicked) {
|
||||
last_clicked->BindColor();
|
||||
last_clicked=NULL;
|
||||
|
@ -2378,10 +2294,17 @@ void MAPPER_RunInternal() {
|
|||
if (mapper.redraw) {
|
||||
mapper.redraw=false;
|
||||
DrawButtons();
|
||||
} else {
|
||||
SDL_UpdateWindowSurface(mapper.window);
|
||||
}
|
||||
BIND_MappingEvents();
|
||||
SDL_Delay(1);
|
||||
}
|
||||
/* ONE SHOULD NOT FORGET TO DO THIS!
|
||||
Unless a memory leak is desired... */
|
||||
SDL_FreeSurface(mapper.draw_surface);
|
||||
SDL_FreeSurface(mapper.draw_surface_nonpaletted);
|
||||
SDL_FreePalette(sdl2_map_pal_ptr);
|
||||
#if defined (REDUCE_JOYSTICK_POLLING)
|
||||
SDL_JoystickEventState(SDL_DISABLE);
|
||||
#endif
|
||||
|
@ -2400,22 +2323,14 @@ void MAPPER_Init(void) {
|
|||
}
|
||||
if (SDL_GetModState()&KMOD_CAPS) {
|
||||
for (CBindList_it bit=caps_lock_event->bindlist.begin();bit!=caps_lock_event->bindlist.end();bit++) {
|
||||
#if SDL_VERSION_ATLEAST(1, 2, 14)
|
||||
(*bit)->ActivateBind(32767,true,false);
|
||||
(*bit)->DeActivateBind(false);
|
||||
#else
|
||||
(*bit)->ActivateBind(32767,true,true); //Skip the action itself as bios_keyboard.cpp handles the startup state.
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (SDL_GetModState()&KMOD_NUM) {
|
||||
for (CBindList_it bit=num_lock_event->bindlist.begin();bit!=num_lock_event->bindlist.end();bit++) {
|
||||
#if SDL_VERSION_ATLEAST(1, 2, 14)
|
||||
(*bit)->ActivateBind(32767,true,false);
|
||||
(*bit)->DeActivateBind(false);
|
||||
#else
|
||||
(*bit)->ActivateBind(32767,true,true);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2429,114 +2344,7 @@ void MAPPER_StartUp(Section * sec) {
|
|||
mapper.sticks.num=0;
|
||||
mapper.sticks.num_groups=0;
|
||||
memset(&virtual_joysticks,0,sizeof(virtual_joysticks));
|
||||
|
||||
usescancodes = false;
|
||||
|
||||
if (section->Get_bool("usescancodes")) {
|
||||
usescancodes=true;
|
||||
|
||||
/* Note: table has to be tested/updated for various OSs */
|
||||
#if defined (MACOSX)
|
||||
/* nothing */
|
||||
#elif !defined (WIN32) /* => Linux & BSDs */
|
||||
bool evdev_input = false;
|
||||
#ifdef SDL_VIDEO_DRIVER_X11
|
||||
//SDL needs to be compiled to use it, else the next makes no sense.
|
||||
#ifdef C_X11_XKB
|
||||
SDL_SysWMinfo info;
|
||||
SDL_VERSION(&info.version);
|
||||
if (SDL_GetWMInfo(&info)) {
|
||||
XkbDescPtr desc = NULL;
|
||||
if((desc = XkbGetMap(info.info.x11.display,XkbAllComponentsMask,XkbUseCoreKbd))) {
|
||||
if(XkbGetNames(info.info.x11.display,XkbAllNamesMask,desc) == 0) {
|
||||
const char* keycodes = XGetAtomName(info.info.x11.display, desc->names->keycodes);
|
||||
// const char* geom = XGetAtomName(info.info.x11.display, desc->names->geometry);
|
||||
if(keycodes) {
|
||||
LOG(LOG_MISC,LOG_NORMAL)("keyboard type %s",keycodes);
|
||||
if (strncmp(keycodes,"evdev",5) == 0) evdev_input = true;
|
||||
}
|
||||
XkbFreeNames(desc,XkbAllNamesMask,True);
|
||||
}
|
||||
XkbFreeClientMap(desc,0,True);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if (evdev_input) {
|
||||
sdlkey_map[0x67]=SDLK_UP;
|
||||
sdlkey_map[0x6c]=SDLK_DOWN;
|
||||
sdlkey_map[0x69]=SDLK_LEFT;
|
||||
sdlkey_map[0x6a]=SDLK_RIGHT;
|
||||
sdlkey_map[0x66]=SDLK_HOME;
|
||||
sdlkey_map[0x6b]=SDLK_END;
|
||||
sdlkey_map[0x68]=SDLK_PAGEUP;
|
||||
sdlkey_map[0x6d]=SDLK_PAGEDOWN;
|
||||
sdlkey_map[0x6e]=SDLK_INSERT;
|
||||
sdlkey_map[0x6f]=SDLK_DELETE;
|
||||
sdlkey_map[0x62]=SDLK_KP_DIVIDE;
|
||||
sdlkey_map[0x60]=SDLK_KP_ENTER;
|
||||
sdlkey_map[0x61]=SDLK_RCTRL;
|
||||
sdlkey_map[0x77]=SDLK_PAUSE;
|
||||
sdlkey_map[0x63]=SDLK_PRINT;
|
||||
sdlkey_map[0x64]=SDLK_RALT;
|
||||
|
||||
//Win-keys
|
||||
sdlkey_map[0x7d]=SDLK_LSUPER;
|
||||
sdlkey_map[0x7e]=SDLK_RSUPER;
|
||||
sdlkey_map[0x7f]=SDLK_MENU;
|
||||
} else {
|
||||
sdlkey_map[0x5a]=SDLK_UP;
|
||||
sdlkey_map[0x60]=SDLK_DOWN;
|
||||
sdlkey_map[0x5c]=SDLK_LEFT;
|
||||
sdlkey_map[0x5e]=SDLK_RIGHT;
|
||||
sdlkey_map[0x59]=SDLK_HOME;
|
||||
sdlkey_map[0x5f]=SDLK_END;
|
||||
sdlkey_map[0x5b]=SDLK_PAGEUP;
|
||||
sdlkey_map[0x61]=SDLK_PAGEDOWN;
|
||||
sdlkey_map[0x62]=SDLK_INSERT;
|
||||
sdlkey_map[0x63]=SDLK_DELETE;
|
||||
sdlkey_map[0x68]=SDLK_KP_DIVIDE;
|
||||
sdlkey_map[0x64]=SDLK_KP_ENTER;
|
||||
sdlkey_map[0x65]=SDLK_RCTRL;
|
||||
sdlkey_map[0x66]=SDLK_PAUSE;
|
||||
sdlkey_map[0x67]=SDLK_PRINT;
|
||||
sdlkey_map[0x69]=SDLK_RALT;
|
||||
}
|
||||
#else
|
||||
sdlkey_map[0xc8]=SDLK_UP;
|
||||
sdlkey_map[0xd0]=SDLK_DOWN;
|
||||
sdlkey_map[0xcb]=SDLK_LEFT;
|
||||
sdlkey_map[0xcd]=SDLK_RIGHT;
|
||||
sdlkey_map[0xc7]=SDLK_HOME;
|
||||
sdlkey_map[0xcf]=SDLK_END;
|
||||
sdlkey_map[0xc9]=SDLK_PAGEUP;
|
||||
sdlkey_map[0xd1]=SDLK_PAGEDOWN;
|
||||
sdlkey_map[0xd2]=SDLK_INSERT;
|
||||
sdlkey_map[0xd3]=SDLK_DELETE;
|
||||
sdlkey_map[0xb5]=SDLK_KP_DIVIDE;
|
||||
sdlkey_map[0x9c]=SDLK_KP_ENTER;
|
||||
sdlkey_map[0x9d]=SDLK_RCTRL;
|
||||
sdlkey_map[0xc5]=SDLK_PAUSE;
|
||||
sdlkey_map[0xb7]=SDLK_PRINT;
|
||||
sdlkey_map[0xb8]=SDLK_RALT;
|
||||
|
||||
//Win-keys
|
||||
sdlkey_map[0xdb]=SDLK_LMETA;
|
||||
sdlkey_map[0xdc]=SDLK_RMETA;
|
||||
sdlkey_map[0xdd]=SDLK_MENU;
|
||||
|
||||
#endif
|
||||
|
||||
Bitu i;
|
||||
for (i=0; i<MAX_SDLKEYS; i++) scancode_map[i]=0;
|
||||
for (i=0; i<MAX_SCANCODES; i++) {
|
||||
SDLKey key=sdlkey_map[i];
|
||||
if (key<MAX_SDLKEYS) scancode_map[key]=(Bit8u)i;
|
||||
}
|
||||
}
|
||||
|
||||
Prop_path* pp = section->Get_path("mapperfile");
|
||||
mapper.filename = pp->realpath;
|
||||
MAPPER_AddHandler(&MAPPER_Run,MK_f1,MMOD1,"mapper","Mapper");
|
||||
}
|
||||
|
||||
|
|
1098
src/gui/sdlmain.cpp
1098
src/gui/sdlmain.cpp
File diff suppressed because it is too large
Load diff
|
@ -89,6 +89,8 @@ static struct {
|
|||
bool nosound;
|
||||
Bit32u freq;
|
||||
Bit32u blocksize;
|
||||
//Note: As stated earlier, all sdl code shall rather be in sdlmain
|
||||
SDL_AudioDeviceID sdldevice;
|
||||
} mixer;
|
||||
|
||||
Bit8u MixTemp[MIXER_BUFSIZE];
|
||||
|
@ -149,6 +151,14 @@ void MIXER_DelChannel(MixerChannel* delchan) {
|
|||
}
|
||||
}
|
||||
|
||||
static void MIXER_LockAudioDevice(void) {
|
||||
SDL_LockAudioDevice(mixer.sdldevice);
|
||||
}
|
||||
|
||||
static void MIXER_UnlockAudioDevice(void) {
|
||||
SDL_UnlockAudioDevice(mixer.sdldevice);
|
||||
}
|
||||
|
||||
void MixerChannel::UpdateVolume(void) {
|
||||
volmul[0]=(Bits)((1 << MIXER_VOLSHIFT)*scale[0]*volmain[0]*mixer.mastervol[0]);
|
||||
volmul[1]=(Bits)((1 << MIXER_VOLSHIFT)*scale[1]*volmain[1]*mixer.mastervol[1]);
|
||||
|
@ -205,9 +215,9 @@ void MixerChannel::Enable(bool _yesno) {
|
|||
enabled=_yesno;
|
||||
if (enabled) {
|
||||
freq_counter = 0;
|
||||
SDL_LockAudio();
|
||||
MIXER_LockAudioDevice();
|
||||
if (done<mixer.done) done=mixer.done;
|
||||
SDL_UnlockAudio();
|
||||
MIXER_UnlockAudioDevice();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -450,14 +460,14 @@ void MixerChannel::AddSamples_s32_nonnative(Bitu len,const Bit32s * data) {
|
|||
}
|
||||
|
||||
void MixerChannel::FillUp(void) {
|
||||
SDL_LockAudio();
|
||||
MIXER_LockAudioDevice();
|
||||
if (!enabled || done<mixer.done) {
|
||||
SDL_UnlockAudio();
|
||||
MIXER_UnlockAudioDevice();
|
||||
return;
|
||||
}
|
||||
float index=PIC_TickIndex();
|
||||
Mix((Bitu)(index*mixer.needed));
|
||||
SDL_UnlockAudio();
|
||||
MIXER_UnlockAudioDevice();
|
||||
}
|
||||
|
||||
extern bool ticksLocked;
|
||||
|
@ -507,12 +517,12 @@ static void MIXER_MixData(Bitu needed) {
|
|||
}
|
||||
|
||||
static void MIXER_Mix(void) {
|
||||
SDL_LockAudio();
|
||||
MIXER_LockAudioDevice();
|
||||
MIXER_MixData(mixer.needed);
|
||||
mixer.tick_counter += mixer.tick_add;
|
||||
mixer.needed+=(mixer.tick_counter >> TICK_SHIFT);
|
||||
mixer.tick_counter &= TICK_MASK;
|
||||
SDL_UnlockAudio();
|
||||
MIXER_UnlockAudioDevice();
|
||||
}
|
||||
|
||||
static void MIXER_Mix_NoSound(void) {
|
||||
|
@ -536,6 +546,7 @@ static void MIXER_Mix_NoSound(void) {
|
|||
}
|
||||
|
||||
static void SDLCALL MIXER_CallBack(void * userdata, Uint8 *stream, int len) {
|
||||
memset(stream, 0, len);
|
||||
Bitu need=(Bitu)len/MIXER_SSIZE;
|
||||
Bit16s * output=(Bit16s *)stream;
|
||||
Bitu reduce;
|
||||
|
@ -763,7 +774,7 @@ void MIXER_Init(Section* sec) {
|
|||
LOG_MSG("MIXER: No Sound Mode Selected.");
|
||||
mixer.tick_add=calc_tickadd(mixer.freq);
|
||||
TIMER_AddTickHandler(MIXER_Mix_NoSound);
|
||||
} else if (SDL_OpenAudio(&spec, &obtained) <0 ) {
|
||||
} else if ((mixer.sdldevice = SDL_OpenAudioDevice(NULL, 0, &spec, &obtained, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE)) ==0 ) {
|
||||
mixer.nosound = true;
|
||||
LOG_MSG("MIXER: Can't open audio: %s , running in nosound mode.",SDL_GetError());
|
||||
mixer.tick_add=calc_tickadd(mixer.freq);
|
||||
|
@ -775,7 +786,7 @@ void MIXER_Init(Section* sec) {
|
|||
mixer.blocksize=obtained.samples;
|
||||
mixer.tick_add=calc_tickadd(mixer.freq);
|
||||
TIMER_AddTickHandler(MIXER_Mix);
|
||||
SDL_PauseAudio(0);
|
||||
SDL_PauseAudioDevice(mixer.sdldevice, 0);
|
||||
}
|
||||
mixer.min_needed=section->Get_int("prebuffer");
|
||||
if (mixer.min_needed>100) mixer.min_needed=100;
|
||||
|
@ -784,3 +795,12 @@ void MIXER_Init(Section* sec) {
|
|||
mixer.needed=mixer.min_needed+1;
|
||||
PROGRAMS_MakeFile("MIXER.COM",MIXER_ProgramStart);
|
||||
}
|
||||
|
||||
void MIXER_CloseAudioDevice(void) {
|
||||
if (!mixer.nosound) {
|
||||
if (mixer.sdldevice != 0) {
|
||||
SDL_CloseAudioDevice(mixer.sdldevice);
|
||||
mixer.sdldevice = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,15 +27,6 @@
|
|||
#include "dos_inc.h"
|
||||
#include "SDL.h"
|
||||
|
||||
/* SDL by default treats numlock and scrolllock different from all other keys.
|
||||
* In recent versions this can disabled by a environment variable which we set in sdlmain.cpp
|
||||
* Define the following if this is the case */
|
||||
#if SDL_VERSION_ATLEAST(1, 2, 14)
|
||||
#define CAN_USE_LOCK 1
|
||||
/* For lower versions of SDL we also use a slight hack to get the startup states of numclock and capslock right.
|
||||
* The proper way is in the mapper, but the repeating key is an unwanted side effect for lower versions of SDL */
|
||||
#endif
|
||||
|
||||
static Bitu call_int16,call_irq1,call_irq6;
|
||||
|
||||
/* Nice table from BOCHS i should feel bad for ripping this */
|
||||
|
@ -241,11 +232,6 @@ static Bitu IRQ1_Handler(void) {
|
|||
flags2=mem_readb(BIOS_KEYBOARD_FLAGS2);
|
||||
flags3=mem_readb(BIOS_KEYBOARD_FLAGS3);
|
||||
leds =mem_readb(BIOS_KEYBOARD_LEDS);
|
||||
#ifdef CAN_USE_LOCK
|
||||
/* No hack anymore! */
|
||||
#else
|
||||
flags2&=~(0x40+0x20);//remove numlock/capslock pressed (hack for sdl only reporting states)
|
||||
#endif
|
||||
if (DOS_LayoutKey(scancode,flags1,flags2,flags3)) return CBRET_NONE;
|
||||
//LOG_MSG("key input %d %d %d %d",scancode,flags1,flags2,flags3);
|
||||
switch (scancode) {
|
||||
|
@ -308,14 +294,8 @@ static Bitu IRQ1_Handler(void) {
|
|||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef CAN_USE_LOCK
|
||||
case 0x3a:flags2 |=0x40;break;//CAPSLOCK
|
||||
case 0xba:flags1 ^=0x40;flags2 &=~0x40;leds ^=0x04;break;
|
||||
#else
|
||||
case 0x3a:flags2 |=0x40;flags1 |=0x40;leds |=0x04;break; //SDL gives only the state instead of the toggle /* Caps Lock */
|
||||
case 0xba:flags1 &=~0x40;leds &=~0x04;break;
|
||||
#endif
|
||||
case 0x45:
|
||||
if (flags3 &0x01) {
|
||||
/* last scancode of pause received; first remove 0xe1-prefix */
|
||||
|
@ -336,13 +316,7 @@ static Bitu IRQ1_Handler(void) {
|
|||
}
|
||||
} else {
|
||||
/* Num Lock */
|
||||
#ifdef CAN_USE_LOCK
|
||||
flags2 |=0x20;
|
||||
#else
|
||||
flags2 |=0x20;
|
||||
flags1 |=0x20;
|
||||
leds |=0x02;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case 0xc5:
|
||||
|
@ -350,15 +324,9 @@ static Bitu IRQ1_Handler(void) {
|
|||
/* pause released */
|
||||
flags3 &=~0x01;
|
||||
} else {
|
||||
#ifdef CAN_USE_LOCK
|
||||
flags1^=0x20;
|
||||
leds^=0x02;
|
||||
flags2&=~0x20;
|
||||
#else
|
||||
/* Num Lock released */
|
||||
flags1 &=~0x20;
|
||||
leds &=~0x02;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case 0x46:flags2 |=0x10;break; /* Scroll Lock SDL Seems to do this one fine (so break and make codes) */
|
||||
|
@ -605,14 +573,6 @@ static void InitBiosSegment(void) {
|
|||
mem_writew(BIOS_KEYBOARD_BUFFER_TAIL,0x1e);
|
||||
Bit8u flag1 = 0;
|
||||
Bit8u leds = 16; /* Ack received */
|
||||
|
||||
#if SDL_VERSION_ATLEAST(1, 2, 14)
|
||||
//Nothing, mapper handles all.
|
||||
#else
|
||||
if (startup_state_capslock) { flag1|=0x40; leds|=0x04;}
|
||||
if (startup_state_numlock) { flag1|=0x20; leds|=0x02;}
|
||||
#endif
|
||||
|
||||
mem_writeb(BIOS_KEYBOARD_FLAGS1,flag1);
|
||||
mem_writeb(BIOS_KEYBOARD_FLAGS2,0);
|
||||
mem_writeb(BIOS_KEYBOARD_FLAGS3,16); /* Enhanced keyboard installed */
|
||||
|
|
Loading…
Add table
Reference in a new issue