diff --git a/surface.c b/surface.c index e3ecc3c..c626a6a 100644 --- a/surface.c +++ b/surface.c @@ -89,6 +89,16 @@ void SDL_Surface_free(JSRuntime *rt, SDL_Surface *s) { // Class definition QJSCLASS(SDL_Surface,) +JSValue make_surface(JSContext *js, SDL_Surface *s){ + JSValue ret = SDL_Surface2js(js,s); + JS_SetPropertyStr(js, ret, "width", JS_NewInt32(js, s->w)); + JS_SetPropertyStr(js, ret, "height", JS_NewInt32(js, s->h)); + JS_SetPropertyStr(js, ret, "format", pixelformat2js(js, s->format)); + JS_SetPropertyStr(js, ret, "pitch", JS_NewFloat64(js, s->pitch)); + + return JS_Stone(js, ret); +} + // SDL_Surface methods JSC_CCALL(surface_blit, SDL_Surface *dst = js2SDL_Surface(js, self); @@ -687,10 +697,6 @@ static const JSCFunctionListEntry js_SDL_Surface_funcs[] = { MIST_FUNC_DEF(surface, pixels, 0), MIST_FUNC_DEF(surface, convert, 1), MIST_FUNC_DEF(surface, toJSON, 0), - JS_CGETSET_DEF("width", js_surface_get_width, NULL), - JS_CGETSET_DEF("height", js_surface_get_height, NULL), - JS_CGETSET_DEF("format", js_surface_get_format, NULL), - JS_CGETSET_DEF("pitch", js_surface_get_pitch, NULL), }; // Helper function to create SDL_Surface from image object diff --git a/video.c b/video.c index e00b784..0f95464 100644 --- a/video.c +++ b/video.c @@ -596,8 +596,7 @@ JSValue js_window_get_sizeInPixels(JSContext *js, JSValue self) return vec22js(js, (vec2){width,height}); } -// Surface related -JSValue js_window_get_surface(JSContext *js, JSValue self) +JSValue js_window_surface(JSContext *js, JSValue self, int argc, JSValue *argv) { SDL_Window *w = js2SDL_Window(js,self); SDL_Surface *surf = SDL_GetWindowSurface(w); @@ -677,6 +676,159 @@ JSValue js_window_sync(JSContext *js, JSValue self, int argc, JSValue *argv) return JS_NULL; } +JSValue js_window_set(JSContext *js, JSValue self, int argc, JSValue *argv) +{ + SDL_Window *w = js2SDL_Window(js,self); + JSValue obj = argv[0]; + JSValue val; + + val = JS_GetPropertyStr(js, obj, "title"); + if (!JS_IsNull(val)) { js_window_set_title(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "size"); + if (!JS_IsNull(val)) { js_window_set_size(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "position"); + if (!JS_IsNull(val)) { js_window_set_position(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "mouseGrab"); + if (!JS_IsNull(val)) { js_window_set_mouseGrab(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "keyboardGrab"); + if (!JS_IsNull(val)) { js_window_set_keyboardGrab(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "opacity"); + if (!JS_IsNull(val)) { js_window_set_opacity(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "minimumSize"); + if (!JS_IsNull(val)) { js_window_set_minimumSize(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "maximumSize"); + if (!JS_IsNull(val)) { js_window_set_maximumSize(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "resizable"); + if (!JS_IsNull(val)) { js_window_set_resizable(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "bordered"); + if (!JS_IsNull(val)) { js_window_set_bordered(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "alwaysOnTop"); + if (!JS_IsNull(val)) { js_window_set_alwaysOnTop(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "fullscreen"); + if (!JS_IsNull(val)) { js_window_set_fullscreen(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "focusable"); + if (!JS_IsNull(val)) { js_window_set_focusable(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "modal"); + if (!JS_IsNull(val)) { js_window_set_modal(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "visible"); + if (!JS_IsNull(val)) { js_window_set_visible(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "minimized"); + if (!JS_IsNull(val)) { js_window_set_minimized(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "maximized"); + if (!JS_IsNull(val)) { js_window_set_maximized(js, self, val); JS_FreeValue(js, val); } + + val = JS_GetPropertyStr(js, obj, "parent"); + if (!JS_IsNull(val)) { js_window_set_parent(js, self, val); JS_FreeValue(js, val); } + + return JS_NULL; +} + +JSValue js_window_state(JSContext *js, JSValue self, int argc, JSValue *argv) +{ + SDL_Window *w = js2SDL_Window(js,self); + JSValue ret = JS_NewObject(js); + + // Title + const char *title = SDL_GetWindowTitle(w); + JS_SetPropertyStr(js, ret, "title", JS_NewString(js, title ? title : "")); + + // Size + int width, height; + SDL_GetWindowSize(w, &width, &height); + JSValue sizeObj = JS_NewObject(js); + JS_SetPropertyStr(js, sizeObj, "x", JS_NewInt32(js, width)); + JS_SetPropertyStr(js, sizeObj, "y", JS_NewInt32(js, height)); + JS_SetPropertyStr(js, ret, "size", sizeObj); + + // Position + int x, y; + SDL_GetWindowPosition(w, &x, &y); + JSValue posObj = JS_NewObject(js); + JS_SetPropertyStr(js, posObj, "x", JS_NewInt32(js, x)); + JS_SetPropertyStr(js, posObj, "y", JS_NewInt32(js, y)); + JS_SetPropertyStr(js, ret, "position", posObj); + + // Minimum size + int minW, minH; + SDL_GetWindowMinimumSize(w, &minW, &minH); + JSValue minSizeObj = JS_NewObject(js); + JS_SetPropertyStr(js, minSizeObj, "x", JS_NewInt32(js, minW)); + JS_SetPropertyStr(js, minSizeObj, "y", JS_NewInt32(js, minH)); + JS_SetPropertyStr(js, ret, "minimumSize", minSizeObj); + + // Maximum size + int maxW, maxH; + SDL_GetWindowMaximumSize(w, &maxW, &maxH); + JSValue maxSizeObj = JS_NewObject(js); + JS_SetPropertyStr(js, maxSizeObj, "x", JS_NewInt32(js, maxW)); + JS_SetPropertyStr(js, maxSizeObj, "y", JS_NewInt32(js, maxH)); + JS_SetPropertyStr(js, ret, "maximumSize", maxSizeObj); + + // Opacity + float opacity = SDL_GetWindowOpacity(w); + JS_SetPropertyStr(js, ret, "opacity", JS_NewFloat64(js, opacity)); + + // Grabs + JS_SetPropertyStr(js, ret, "mouseGrab", JS_NewBool(js, SDL_GetWindowMouseGrab(w))); + JS_SetPropertyStr(js, ret, "keyboardGrab", JS_NewBool(js, SDL_GetWindowKeyboardGrab(w))); + + // Flags-based properties + SDL_WindowFlags flags = SDL_GetWindowFlags(w); + JS_SetPropertyStr(js, ret, "fullscreen", JS_NewBool(js, flags & SDL_WINDOW_FULLSCREEN)); + JS_SetPropertyStr(js, ret, "resizable", JS_NewBool(js, flags & SDL_WINDOW_RESIZABLE)); + JS_SetPropertyStr(js, ret, "bordered", JS_NewBool(js, !(flags & SDL_WINDOW_BORDERLESS))); + JS_SetPropertyStr(js, ret, "alwaysOnTop", JS_NewBool(js, flags & SDL_WINDOW_ALWAYS_ON_TOP)); + JS_SetPropertyStr(js, ret, "focusable", JS_NewBool(js, !(flags & SDL_WINDOW_NOT_FOCUSABLE))); + JS_SetPropertyStr(js, ret, "modal", JS_NewBool(js, flags & SDL_WINDOW_MODAL)); + JS_SetPropertyStr(js, ret, "visible", JS_NewBool(js, !(flags & SDL_WINDOW_HIDDEN))); + JS_SetPropertyStr(js, ret, "minimized", JS_NewBool(js, flags & SDL_WINDOW_MINIMIZED)); + JS_SetPropertyStr(js, ret, "maximized", JS_NewBool(js, flags & SDL_WINDOW_MAXIMIZED)); + + // Display properties + JS_SetPropertyStr(js, ret, "displayScale", JS_NewFloat64(js, SDL_GetWindowDisplayScale(w))); + JS_SetPropertyStr(js, ret, "pixelDensity", JS_NewFloat64(js, SDL_GetWindowPixelDensity(w))); + + // Size in pixels + int pixelW, pixelH; + SDL_GetWindowSizeInPixels(w, &pixelW, &pixelH); + JSValue pixelSizeObj = JS_NewObject(js); + JS_SetPropertyStr(js, pixelSizeObj, "x", JS_NewInt32(js, pixelW)); + JS_SetPropertyStr(js, pixelSizeObj, "y", JS_NewInt32(js, pixelH)); + JS_SetPropertyStr(js, ret, "sizeInPixels", pixelSizeObj); + + // Flags + JS_SetPropertyStr(js, ret, "flags", JS_NewInt64(js, flags)); + + JS_SetPropertyStr(js, ret, "id", JS_NewUint32(js, SDL_GetWindowID(w))); + + // Parent + SDL_Window *parent = SDL_GetWindowParent(w); + if (parent) + JS_SetPropertyStr(js, ret, "parent", SDL_Window2js(js, parent)); + else + JS_SetPropertyStr(js, ret, "parent", JS_NULL); + + return ret; +} + + + static const JSCFunctionListEntry js_SDL_Window_funcs[] = { MIST_FUNC_DEF(SDL_Window, fullscreen, 0), MIST_FUNC_DEF(SDL_Window, keyboard_shown, 0), @@ -688,30 +840,9 @@ static const JSCFunctionListEntry js_SDL_Window_funcs[] = { MIST_FUNC_DEF(window, flash, 1), MIST_FUNC_DEF(window, destroy, 0), MIST_FUNC_DEF(window, sync, 0), - CGETSET_ADD(window, title), - CGETSET_ADD(window, size), - CGETSET_ADD(window, position), - CGETSET_ADD(window, mouseGrab), - CGETSET_ADD(window, keyboardGrab), - CGETSET_ADD(window, opacity), - CGETSET_ADD(window, minimumSize), - CGETSET_ADD(window, maximumSize), - CGETSET_ADD(window, resizable), - CGETSET_ADD(window, bordered), - CGETSET_ADD(window, alwaysOnTop), - CGETSET_ADD(window, fullscreen), - CGETSET_ADD(window, focusable), - CGETSET_ADD(window, modal), - CGETSET_ADD(window, visible), - CGETSET_ADD(window, minimized), - CGETSET_ADD(window, maximized), - CGETSET_ADD(window, parent), - JS_CGETSET_DEF("id", js_window_get_id, NULL), - JS_CGETSET_DEF("pixelDensity", js_window_get_pixelDensity, NULL), - JS_CGETSET_DEF("displayScale", js_window_get_displayScale, NULL), - JS_CGETSET_DEF("sizeInPixels", js_window_get_sizeInPixels, NULL), - JS_CGETSET_DEF("flags", js_window_get_flags, NULL), - JS_CGETSET_DEF("surface", js_window_get_surface, NULL), + MIST_FUNC_DEF(window, set, 1), + MIST_FUNC_DEF(window, state, 0), + MIST_FUNC_DEF(window, surface, 0), MIST_FUNC_DEF(window, updateSurface, 0), MIST_FUNC_DEF(window, updateSurfaceRects, 1), };