#pragma once #include "Common.h" #include "Python.h" // Forward declarations class GameEngine; // Python object structure for Window singleton typedef struct { PyObject_HEAD // No data - Window is a singleton that accesses GameEngine } PyWindowObject; // C++ interface for the Window singleton class PyWindow { public: // Static methods for Python type static PyObject* get(PyObject* cls, PyObject* args); static PyObject* repr(PyWindowObject* self); // Getters and setters for window properties static PyObject* get_resolution(PyWindowObject* self, void* closure); static int set_resolution(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_fullscreen(PyWindowObject* self, void* closure); static int set_fullscreen(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_vsync(PyWindowObject* self, void* closure); static int set_vsync(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_title(PyWindowObject* self, void* closure); static int set_title(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_visible(PyWindowObject* self, void* closure); static int set_visible(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_framerate_limit(PyWindowObject* self, void* closure); static int set_framerate_limit(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_game_resolution(PyWindowObject* self, void* closure); static int set_game_resolution(PyWindowObject* self, PyObject* value, void* closure); static PyObject* get_scaling_mode(PyWindowObject* self, void* closure); static int set_scaling_mode(PyWindowObject* self, PyObject* value, void* closure); // Methods static PyObject* center(PyWindowObject* self, PyObject* args); static PyObject* screenshot(PyWindowObject* self, PyObject* args, PyObject* kwds); static PyGetSetDef getsetters[]; static PyMethodDef methods[]; }; namespace mcrfpydef { static PyTypeObject PyWindowType = { .ob_base = {.ob_base = {.ob_refcnt = 1, .ob_type = NULL}, .ob_size = 0}, .tp_name = "mcrfpy.Window", .tp_basicsize = sizeof(PyWindowObject), .tp_itemsize = 0, .tp_dealloc = (destructor)[](PyObject* self) { // Don't delete the singleton instance Py_TYPE(self)->tp_free(self); }, .tp_repr = (reprfunc)PyWindow::repr, .tp_flags = Py_TPFLAGS_DEFAULT, .tp_doc = PyDoc_STR("Window singleton for accessing and modifying the game window properties"), .tp_methods = nullptr, // Set in McRFPy_API.cpp after definition .tp_getset = nullptr, // Set in McRFPy_API.cpp after definition .tp_new = [](PyTypeObject* type, PyObject* args, PyObject* kwds) -> PyObject* { PyErr_SetString(PyExc_TypeError, "Cannot instantiate Window. Use Window.get() to access the singleton."); return NULL; } }; }