shithub: npe

Download patch

ref: 8400240efda16e4261a17eac0f5b719701b16cd8
parent: fadb98dc10ea98482c48c8daeb6b5cf840ef47bd
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Sun Jun 9 11:44:25 EDT 2024

sdl2: assortment of fixes and funcs (thanks moody)

--- a/include/npe/SDL2/SDL.h
+++ b/include/npe/SDL2/SDL.h
@@ -179,6 +179,7 @@
 int SDL_SoftStretch(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect);
 int SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch);
 int SDL_UnlockTexture(SDL_Texture *texture);
+int SDL_GetWindowBordersSize(SDL_Window *window, int *top, int *left, int *bot, int *right);
  
 enum {
 	SDL_QUERY = -1,
@@ -194,6 +195,9 @@
 	SDL_WINDOW_SHOWN = 1<<4,
 	SDL_WINDOW_RESIZABLE = 1<<5,
 	SDL_WINDOW_HIDDEN = 1<<6,
+	SDL_WINDOW_MAXIMIZED = 1<<7,
+	SDL_WINDOW_FULLSCREEN = 1<<8,
+	SDL_WINDOW_BORDERLESS = 1<<9,
 
 	SDL_WINDOWPOS_CENTERED = -1,
 	SDL_WINDOWPOS_UNDEFINED = -2,
@@ -202,6 +206,7 @@
 	SDL_INIT_AUDIO = 1<<1,
 	SDL_INIT_VIDEO = 1<<2,
 	SDL_INIT_JOYSTICK = 0,
+	SDL_INIT_GAMECONTROLLER = 0,
 
 	SDL_BLENDMODE_NONE = 0,
 	SDL_BLENDMODE_BLEND,
@@ -321,5 +326,18 @@
 struct SDL_mutex {
 	Lock l;
 };
+
+typedef enum {
+	SDL_HITTEST_NORMAL,
+	SDL_HITTEST_DRAGGABLE,
+	SDL_HITTEST_RESIZE_TOPLEFT,
+	SDL_HITTEST_RESIZE_TOP,
+	SDL_HITTEST_RESIZE_TOPRIGHT,
+	SDL_HITTEST_RESIZE_RIGHT,
+	SDL_HITTEST_RESIZE_BOTTOMRIGHT,
+	SDL_HITTEST_RESIZE_BOTTOM,
+	SDL_HITTEST_RESIZE_BOTTOMLEFT,
+	SDL_HITTEST_RESIZE_LEFT,
+} SDL_HitTestResult;
 
 #endif
--- a/include/npe/SDL2/SDL_events.h
+++ b/include/npe/SDL2/SDL_events.h
@@ -151,5 +151,6 @@
 SDL_Scancode SDL_GetScancodeFromKey(SDL_Keycode key);
 Uint8* SDL_GetKeyboardState(int *numkeys);
 char* SDL_GetKeyName(SDL_Keycode key);
+SDL_Keycode SDL_GetKeyFromName(char *name);
 
 #endif
--- a/libnpe_sdl2/events.c
+++ b/libnpe_sdl2/events.c
@@ -315,10 +315,107 @@
 char*
 SDL_GetKeyName(SDL_Keycode key)
 {
-	USED(key);
-	return ""; /* FIXME */
+	/* upstream quirk: return value is valid only until next call */
+	static char res[64];
+
+	res[0] = res[1] = '\0';
+	if(key >= '0' && key <= '9' || key == '-' || key == '=' || key == '\'')
+		res[0] = key;
+	else if(key == '[' || key == ']' || key == '\\' || key == ';' || key == '/')
+		res[0] = key;
+	else if(key >= 'a' && key <= 'z')
+		res[0] = toupper(key);
+	else if(key >= (KF|1) && key <= (KF|12))
+		snprint(res, sizeof(res), "F%d", key - KF);
+	else if(key == '\n')
+		return "Return";
+	else if(key == Kesc)
+		return "Escape";
+	else if(key == Kbs)
+		return "Backspace";
+	else if(key == '\t')
+		return "Tab";
+	else if(key == ' ')
+		return "Space";
+	else if(key == Kright)
+		return "Right";
+	else if(key == Kleft)
+		return "Left";
+	else if(key == Kup)
+		return "Up";
+	else if(key == Kdown)
+		return "Down";
+	else if(key == Kins)
+		return "Insert";
+	else if(key == Khome)
+		return "Home";
+	else if(key == Kpgup)
+		return "PageUp";
+	else if(key == Kpgdown)
+		return "PageDown";
+	else if(key == Kdel)
+		return "Delete";
+	else if(key == Kend)
+		return "End";
+	else if(key == Kalt)
+		return "Left Alt";
+	else if(key == Kctl)
+		return "Left Ctrl";
+	else if(key == Kmod4)
+		return "Left GUI";
+	else if(key == Kaltgr)
+		return "Right Alt";
+	else if(key == Kshift)
+		return "Left Shift";
+
+	return res;
 }
 
+SDL_Keycode
+SDL_GetKeyFromName(char *name)
+{
+	char *e;
+	long p;
+
+	if(strcmp(name, "Return") == 0) return '\n';
+	if(strcmp(name, "Escape") == 0) return Kesc;
+	if(strcmp(name, "Backspace") == 0) return Kbs;
+	if(strcmp(name, "Tab") == 0) return '\t';
+	if(strcmp(name, "Space") == 0) return ' ';
+	if(strcmp(name, "Right") == 0) return Kright;
+	if(strcmp(name, "Left") == 0) return Kleft;
+	if(strcmp(name, "Up") == 0) return Kup;
+	if(strcmp(name, "Down") == 0) return Kdown;
+	if(strcmp(name, "Insert") == 0) return Kins;
+	if(strcmp(name, "Home") == 0) return Khome;
+	if(strcmp(name, "PageUp") == 0) return Kpgup;
+	if(strcmp(name, "PageDown") == 0) return Kpgdown;
+	if(strcmp(name, "Delete") == 0) return Kdel;
+	if(strcmp(name, "End") == 0) return Kend;
+	if(strcmp(name, "Left Alt") == 0) return Kalt;
+	if(strcmp(name, "Left Ctrl") == 0) return Kctl;
+	if(strcmp(name, "Left GUI") == 0) return Kmod4;
+	if(strcmp(name, "Right Alt") == 0) return Kaltgr;
+	if(strcmp(name, "Left Shift") == 0) return Kshift;
+	if(name[0] == 'F' && name[1] != '\0'){
+		p = strtol(name+1, &e, 10);
+		if(e == name + 1 || p < 1 || p > 12)
+			return SDLK_UNKNOWN;
+		return KF | p;
+	}
+	if(name[0] >= '0' && name[0] <= '9')
+		return name[0];
+	if(name[0] >= 'A' && name[0] <= 'Z')
+		return tolower(name[0]);
+	if(name[0] >= 'a' && name[0] <= 'z')
+		return name[0];
+	if(name[0] == '-' || name[0] == '=' || name[0] == '\'')
+		return name[0];
+	if(name[0] == '[' || name[0] == ']' || name[0] == '\\' || name[0] == ';' || name[0] == '/')
+		return name[0];
+	return SDLK_UNKNOWN;
+}
+
 static void
 kbdproc(void *)
 {
@@ -362,7 +459,7 @@
 
 		case 'k':
 			s = buf+1;
-			memset(kbdstate, 0, sizeof kbdstate);
+			memset(kbdstate, 0, sizeof(kbdstate));
 			while(*s){
 				s += chartorune(&r, s);
 				scan = SDL_GetScancodeFromKey(r);
@@ -397,7 +494,7 @@
 
 		case 'K':
 			s = buf2+1;
-			memset(kbdstate, 0, sizeof kbdstate);
+			memset(kbdstate, 0, sizeof(kbdstate));
 			while(*s){
 				s += chartorune(&r, s);
 				scan = SDL_GetScancodeFromKey(r);
--- a/libnpe_sdl2/sdl2.c
+++ b/libnpe_sdl2/sdl2.c
@@ -134,7 +134,7 @@
 			if(rm & 0xFF0000)
 				return ARGB32;
 			else
-				return XBGR32;
+				return ABGR32;
 		}
 	}
 	assert(0);
@@ -1786,4 +1786,18 @@
 	v->major = 2;
 	v->minor = 24;
 	v->patch = 1;
+}
+
+int
+SDL_GetWindowBordersSize(SDL_Window *, int *t, int *l, int *b, int *r)
+{
+	if(t != nil)
+		*t = Borderwidth;
+	if(l != nil)
+		*l = Borderwidth;
+	if(b != nil)
+		*b = Borderwidth;
+	if(r != nil)
+		*r = Borderwidth;
+	return 0;
 }