diff --git a/doomsday/engine/portable/include/canvaswindow.h b/doomsday/engine/portable/include/canvaswindow.h index 9784e2fa22..6d9e7b1df1 100644 --- a/doomsday/engine/portable/include/canvaswindow.h +++ b/doomsday/engine/portable/include/canvaswindow.h @@ -36,6 +36,7 @@ class CanvasWindow : public QMainWindow public: explicit CanvasWindow(QWidget *parent = 0); + ~CanvasWindow(); Canvas& canvas(); @@ -50,7 +51,8 @@ class CanvasWindow : public QMainWindow public slots: private: - Canvas* _canvas; + struct Instance; + Instance* d; }; #endif // CANVASWINDOW_H diff --git a/doomsday/engine/portable/include/dd_loop.h b/doomsday/engine/portable/include/dd_loop.h index d92f751065..247999751f 100644 --- a/doomsday/engine/portable/include/dd_loop.h +++ b/doomsday/engine/portable/include/dd_loop.h @@ -41,8 +41,17 @@ void DD_RegisterLoop(void); */ int DD_GameLoop(void); +/** + * Called periodically while the game loop is running. + */ void DD_GameLoopCallback(void); +/** + * Window drawing callback. + * + * Drawing anything outside this routine is frowned upon. + * Seriously frowned! (Don't do it.) + */ void DD_GameLoopDrawer(void); /** diff --git a/doomsday/engine/portable/include/sys_console.h b/doomsday/engine/portable/include/sys_console.h index 37ab9b03a2..d4530bb273 100644 --- a/doomsday/engine/portable/include/sys_console.h +++ b/doomsday/engine/portable/include/sys_console.h @@ -53,7 +53,7 @@ typedef struct consolewindow_s { Window* Sys_ConInit(const char* title); void Sys_ConShutdown(uint idx); -void Sys_ConSetTitle(uint idx, const char* title); +void ConsoleWindow_SetTitle(const Window *window, const char* title); /** * @param flags @see consolePrintFlags diff --git a/doomsday/engine/portable/include/sys_window.h b/doomsday/engine/portable/include/sys_window.h index 30cdfe795b..0129455d97 100644 --- a/doomsday/engine/portable/include/sys_window.h +++ b/doomsday/engine/portable/include/sys_window.h @@ -112,10 +112,14 @@ boolean Sys_GetDesktopBPP(int* bpp); * * @return If @c 0, window creation was unsuccessful, * ELSE 1-based index identifier of the new window. + * + * @todo Refactor for New/Delete convention. */ -uint Sys_CreateWindow(application_t* app, const Point2Raw* origin, - const Size2Raw* size, int bpp, int flags, ddwindowtype_t type, const char* title, void* data); -boolean Sys_DestroyWindow(uint idx); +uint Window_Create(application_t* app, const Point2Raw* origin, + const Size2Raw* size, int bpp, int flags, ddwindowtype_t type, + const char* title, void* data); + +boolean Window_Destroy(uint idx); void Window_Show(Window* wnd, boolean show); @@ -146,15 +150,13 @@ int Window_BitsPerPixel(const Window* wnd); */ const Size2Raw* Window_Size(const Window* wnd); -void Sys_UpdateWindow(uint idx); +void Window_SwapBuffers(const Window* win); -boolean Sys_GetWindowBPP(uint idx, int* bpp); -boolean Sys_GetWindowFullscreen(uint idx, boolean* fullscreen); -boolean Sys_GetWindowVisibility(uint idx, boolean* show); +boolean Sys_GetWindowFullscreen(uint idx, boolean* fullscreen); /// @todo refactor -boolean Sys_SetActiveWindow(uint idx); boolean Sys_SetWindow(uint idx, int x, int y, int w, int h, int bpp, uint wflags, uint uflags); -boolean Sys_SetWindowTitle(uint idx, const char* title); + +void Window_SetTitle(const Window *win, const char* title); /** * Sets the function who will draw the contents of the window when needed. @@ -171,8 +173,8 @@ void Window_SetDrawFunction(Window* win, void (*drawFunc)(void)); */ void Window_Draw(Window* win); -Window* Sys_Window(uint idx); -Window* Sys_MainWindow(void); +Window* Window_ByIndex(uint idx); +Window* Window_Main(void); /** *\todo This is a compromise to prevent having to refactor half the diff --git a/doomsday/engine/portable/src/canvaswindow.cpp b/doomsday/engine/portable/src/canvaswindow.cpp index a9f0acdbda..a57f544d6f 100644 --- a/doomsday/engine/portable/src/canvaswindow.cpp +++ b/doomsday/engine/portable/src/canvaswindow.cpp @@ -25,20 +25,32 @@ #include +struct CanvasWindow::Instance +{ + Canvas* canvas; +}; + CanvasWindow::CanvasWindow(QWidget *parent) : QMainWindow(parent) { + d = new Instance; + // Create the drawing canvas for this window. - setCentralWidget(_canvas = new Canvas); // takes ownership + setCentralWidget(d->canvas = new Canvas); // takes ownership +} + +CanvasWindow::~CanvasWindow() +{ + delete d; } Canvas& CanvasWindow::canvas() { - assert(_canvas != 0); - return *_canvas; + assert(d->canvas != 0); + return *d->canvas; } -void CanvasWindow::setDefaultGLFormat() +void CanvasWindow::setDefaultGLFormat() // static { // Configure the GL settings for all subsequently created canvases. QGLFormat fmt; diff --git a/doomsday/engine/portable/src/con_busy.c b/doomsday/engine/portable/src/con_busy.c index b90d02443c..111db94e38 100644 --- a/doomsday/engine/portable/src/con_busy.c +++ b/doomsday/engine/portable/src/con_busy.c @@ -191,7 +191,7 @@ int Con_Busy2(BusyTask* task) DD_ResetTimer(); // Resume drawing with the game loop drawer. - Window_SetDrawFunction(Sys_MainWindow(), !Sys_IsShuttingDown()? DD_GameLoopDrawer : 0); + Window_SetDrawFunction(Window_Main(), !Sys_IsShuttingDown()? DD_GameLoopDrawer : 0); return result; } @@ -436,7 +436,7 @@ static void Con_BusyLoop(void) glLoadIdentity(); glOrtho(0, Window_Width(theWindow), Window_Height(theWindow), 0, -1, 1); - Window_SetDrawFunction(Sys_MainWindow(), Con_BusyDrawer); + Window_SetDrawFunction(Window_Main(), Con_BusyDrawer); } Sys_Lock(busy_Mutex); @@ -472,7 +472,7 @@ static void Con_BusyLoop(void) // Time for an update? if(canDraw) { - Window_Draw(Sys_MainWindow()); + Window_Draw(Window_Main()); } // Make sure the audio system gets regularly updated. @@ -492,7 +492,7 @@ static void Con_BusyLoop(void) glPopMatrix(); // Must not call the busy drawer outside of this loop. - Window_SetDrawFunction(Sys_MainWindow(), 0); + Window_SetDrawFunction(Window_Main(), 0); } } @@ -780,7 +780,7 @@ static void Con_BusyDrawer(void) Z_DebugDrawer(); #endif - Sys_UpdateWindow(mainWindowIdx); + Window_SwapBuffers(theWindow); } boolean Con_TransitionInProgress(void) diff --git a/doomsday/engine/portable/src/dd_init.cpp b/doomsday/engine/portable/src/dd_init.cpp index a0bc15d0cd..e329b38315 100644 --- a/doomsday/engine/portable/src/dd_init.cpp +++ b/doomsday/engine/portable/src/dd_init.cpp @@ -79,7 +79,7 @@ int main(int argc, char** argv) #endif // Show the main window. This also completes the initialization. - Window_Show(Sys_MainWindow(), true); + Window_Show(Window_Main(), true); // Run the main loop. int result = DD_GameLoop(); diff --git a/doomsday/engine/portable/src/dd_loop.c b/doomsday/engine/portable/src/dd_loop.c index 4ecc7d96fb..dfd12f47c5 100644 --- a/doomsday/engine/portable/src/dd_loop.c +++ b/doomsday/engine/portable/src/dd_loop.c @@ -145,18 +145,12 @@ void DD_GameLoopCallback(void) endFrame(); // Draw the frame. - Window_Draw(Sys_MainWindow()); + Window_Draw(Window_Main()); // After the first frame, start timedemo. DD_CheckTimeDemo(); } -/** - * Window drawing callback. - * - * Drawing anything outside this routine is frowned upon. - * Seriously frowned! (Don't do it.) - */ void DD_GameLoopDrawer(void) { if(novideo) diff --git a/doomsday/engine/portable/src/dd_main.c b/doomsday/engine/portable/src/dd_main.c index 0520904967..4b64c50b69 100644 --- a/doomsday/engine/portable/src/dd_main.c +++ b/doomsday/engine/portable/src/dd_main.c @@ -1194,7 +1194,7 @@ boolean DD_ChangeGame2(Game* game, boolean allowReload) Library_ReleaseGames(); DD_ComposeMainWindowTitle(buf); - Sys_SetWindowTitle(mainWindowIdx, buf); + Window_SetTitle(theWindow, buf); if(!DD_IsShuttingDown()) { @@ -1213,7 +1213,7 @@ boolean DD_ChangeGame2(Game* game, boolean allowReload) theGame = game; DD_ComposeMainWindowTitle(buf); - Sys_SetWindowTitle(mainWindowIdx, buf); + Window_SetTitle(theWindow, buf); /** * If we aren't shutting down then we are either loading a game or switching @@ -1450,7 +1450,7 @@ void DD_FinishInitializationAfterWindowReady(void) { char buf[256]; DD_ComposeMainWindowTitle(buf); - Sys_SetWindowTitle(mainWindowIdx, buf); + Window_SetTitle(theWindow, buf); } // Initialize engine subsystems and initial state. @@ -1464,7 +1464,7 @@ void DD_FinishInitializationAfterWindowReady(void) LegacyCore_SetLoopFunc(de2LegacyCore, DD_GameLoopCallback); // Start drawing with the game loop drawer. - Window_SetDrawFunction(Sys_MainWindow(), DD_GameLoopDrawer); + Window_SetDrawFunction(Window_Main(), DD_GameLoopDrawer); } /** diff --git a/doomsday/engine/portable/src/gl_main.c b/doomsday/engine/portable/src/gl_main.c index 3792cb7782..1763ef0aac 100644 --- a/doomsday/engine/portable/src/gl_main.c +++ b/doomsday/engine/portable/src/gl_main.c @@ -179,7 +179,7 @@ void GL_DoUpdate(void) DD_WaitForOptimalUpdateTime(); // Blit screen to video. - Sys_UpdateWindow(mainWindowIdx); + Window_SwapBuffers(theWindow); // Increment frame counter. r_framecounter++; @@ -448,11 +448,6 @@ boolean GL_EarlyInit(void) Con_Message("Using restricted texture w/h ratio (1:8).\n"); ratioLimit = 8; - Sys_GetWindowBPP(mainWindowIdx, &bpp); - if(bpp == 32) - { - Con_Message("Warning: Are you sure your video card accelerates a 32 bit mode?\n"); - } } // Set a custom maximum size? if(ArgCheckWith("-maxtex", 1)) diff --git a/doomsday/engine/portable/src/sys_window.cpp b/doomsday/engine/portable/src/sys_window.cpp index 1c47340bf1..296e305a34 100644 --- a/doomsday/engine/portable/src/sys_window.cpp +++ b/doomsday/engine/portable/src/sys_window.cpp @@ -68,7 +68,7 @@ static boolean mainWindowInited = false; static int screenWidth, screenHeight, screenBPP; static boolean screenIsWindow; -Window* Sys_MainWindow(void) +Window* Window_Main(void) { return &mainWindow; } @@ -85,7 +85,7 @@ static __inline Window *getWindow(uint idx) return NULL; } -Window* Sys_Window(uint id) +Window* Window_ByIndex(uint id) { return getWindow(id); } @@ -388,7 +388,7 @@ boolean Sys_ShutdownWindowManager(void) return false; // Window manager is not initialized. if(mainWindow.type == WT_CONSOLE) - Sys_DestroyWindow(1); + Window_Destroy(1); // Now off-line, no more window management will be possible. winManagerInited = false; @@ -458,27 +458,6 @@ static void drawCanvasWithCallback(Canvas& canvas) } } -void Window_SetDrawFunction(Window* win, void (*drawFunc)(void)) -{ - if(win->type == WT_CONSOLE) return; - - assert(win); - assert(win->widget); - - win->drawFunc = drawFunc; - win->widget->canvas().setDrawCallback(drawFunc? drawCanvasWithCallback : 0); -} - -void Window_Draw(Window* win) -{ - if(win->type == WT_CONSOLE) return; - - assert(win); - assert(win->widget); - - win->widget->canvas().forcePaint(); -} - static void finishMainWindowInit(Canvas& canvas) { assert(&mainWindow.widget->canvas() == &canvas); @@ -555,8 +534,9 @@ static Window* createDDWindow(application_t*, const Point2Raw* origin, const Siz return &mainWindow; } -uint Sys_CreateWindow(application_t* app, const Point2Raw* origin, - const Size2Raw* size, int bpp, int flags, ddwindowtype_t type, const char* title, void*) +uint Window_Create(application_t* app, const Point2Raw* origin, + const Size2Raw* size, int bpp, int flags, ddwindowtype_t type, + const char* title, void*) { if(!winManagerInited) return 0; @@ -576,7 +556,7 @@ uint Sys_CreateWindow(application_t* app, const Point2Raw* origin, * * @return @c true, if successful. */ -boolean Sys_DestroyWindow(uint idx) +boolean Window_Destroy(uint idx) { Window* window = getWindow(idx); @@ -591,19 +571,6 @@ boolean Sys_DestroyWindow(uint idx) return true; } -/** - * Change the currently active window. - * - * @param idx Index of the window to make active (1-based). - * - * @return @c true, if successful. - */ -boolean Sys_SetActiveWindow(uint idx) -{ - // We only support one window, so yes its active. - return true; -} - /** * Attempt to set the appearance/behavioral properties of the given window. * @@ -667,11 +634,10 @@ boolean Sys_SetWindow(uint idx, int newX, int newY, int newWidth, int newHeight, /** * Make the content of the framebuffer visible. */ -void Sys_UpdateWindow(uint idx) +void Window_SwapBuffers(const Window* win) { LIBDENG_ASSERT_IN_MAIN_THREAD(); - Window* win = getWindow(idx); assert(win); if(!win->widget) return; @@ -687,52 +653,26 @@ void Sys_UpdateWindow(uint idx) * * @return @c true, if successful. */ -boolean Sys_SetWindowTitle(uint idx, const char *title) +void Window_SetTitle(const Window* win, const char *title) { - Window *window = getWindow(idx); + assert(win); LIBDENG_ASSERT_IN_MAIN_THREAD(); - if(window) + switch(win->type) { - if(window->type == WT_NORMAL) - { -#if 0 - SDL_WM_SetCaption(title, NULL); -#endif - } - else // It's a terminal window. - { - Sys_ConSetTitle(idx, title); - } - return true; - } - - return false; -} - -/** - * Attempt to get the BPP (bits-per-pixel) of the given window. - * - * @param idx Index identifier (1-based) to the window. - * @param bpp Address to write the BPP back to (if any). - * - * @return @c true, if successful. - */ -boolean Sys_GetWindowBPP(uint idx, int *bpp) -{ - Window* window = getWindow(idx); - - if(!window || !bpp) - return false; + case WT_NORMAL: + assert(win->widget); + win->widget->setWindowTitle(QString::fromLatin1(title)); + break; - // Not in dedicated mode. - if(isDedicated) - return false; - - *bpp = window->bpp; + case WT_CONSOLE: + ConsoleWindow_SetTitle(win, title); + break; - return true; + default: + break; + } } /** @@ -781,6 +721,28 @@ HWND Sys_GetWindowHandle(uint idx) #endif +void Window_SetDrawFunction(Window* win, void (*drawFunc)(void)) +{ + if(win->type == WT_CONSOLE) return; + + assert(win); + assert(win->widget); + + win->drawFunc = drawFunc; + win->widget->canvas().setDrawCallback(drawFunc? drawCanvasWithCallback : 0); +} + +void Window_Draw(Window* win) +{ + if(win->type == WT_CONSOLE) return; + + assert(win); + assert(win->widget); + + // Repaint right now. + win->widget->canvas().forcePaint(); +} + void Window_Show(Window *wnd, boolean show) { /// Assumption: This is only called once, during startup. diff --git a/doomsday/engine/unix/src/dd_uinit.c b/doomsday/engine/unix/src/dd_uinit.c index a29cd57c93..a2c48c9769 100644 --- a/doomsday/engine/unix/src/dd_uinit.c +++ b/doomsday/engine/unix/src/dd_uinit.c @@ -345,8 +345,8 @@ static int createMainWindow(void) Size2Raw size = { 640, 480 }; char buf[256]; DD_ComposeMainWindowTitle(buf); - mainWindowIdx = Sys_CreateWindow(&app, &origin, &size, 32, 0, - isDedicated? WT_CONSOLE : WT_NORMAL, buf, 0); + mainWindowIdx = Window_Create(&app, &origin, &size, 32, 0, + isDedicated? WT_CONSOLE : WT_NORMAL, buf, 0); return mainWindowIdx != 0; } @@ -405,21 +405,6 @@ boolean DD_Unix_Init(int argc, char** argv) failed = false; }} - /*if(!Sys_GLInitialize()) - { - DD_ErrorBox(true, "Error initializing OpenGL."); - } - else - { // All initialization complete. - failed = false; - - /// @todo This is the window manager's responsibility. - { char buf[256]; - DD_ComposeMainWindowTitle(buf); - Sys_SetWindowTitle(mainWindowIdx, buf); - } - }}*/ - return !failed; } diff --git a/doomsday/engine/unix/src/sys_console.c b/doomsday/engine/unix/src/sys_console.c index 18646e0caa..00aa8b9b1b 100644 --- a/doomsday/engine/unix/src/sys_console.c +++ b/doomsday/engine/unix/src/sys_console.c @@ -31,18 +31,18 @@ #include -#define mainConsole (*Window_Console(Sys_MainWindow())) +#define mainConsole (*Window_Console(Window_Main())) #define LINELEN 256 // @todo Lazy: This is the max acceptable window width. static WINDOW* cursesRootWin; static boolean conInputInited = false; -static boolean isValidWindow(Window* win) +static boolean isValidWindow(const Window* win) { if(Window_Type(win) == WT_CONSOLE) { - consolewindow_t* console = Window_Console(win); + const consolewindow_t* console = Window_ConsoleConst(win); return console->winText && console->winTitle && console->winCommand; } return true; @@ -50,7 +50,7 @@ static boolean isValidWindow(Window* win) static void setAttrib(int flags) { - if(!isValidWindow(Sys_MainWindow())) + if(!isValidWindow(Window_Main())) return; if(flags & (CPF_YELLOW | CPF_LIGHT)) @@ -64,7 +64,7 @@ static void setAttrib(int flags) */ static void writeText(const char *line, int len) { - if(!isValidWindow(Sys_MainWindow())) return; + if(!isValidWindow(Window_Main())) return; wmove(mainConsole.winText, mainConsole.cy, mainConsole.cx); waddnstr(mainConsole.winText, line, len); @@ -75,7 +75,7 @@ static int getScreenSize(int axis) { int x, y; - if(!isValidWindow(Sys_MainWindow())) return; + if(!isValidWindow(Window_Main())) return; getmaxyx(mainConsole.winText, y, x); return axis == VX ? x : y; @@ -96,7 +96,7 @@ static void setConWindowCmdLine(uint idx, const char *text, // We only support one console window; (this isn't for us). return; } - win = Sys_MainWindow(); + win = Window_Main(); if(!isValidWindow(win)) return; console = Window_Console(win); @@ -150,7 +150,7 @@ void Sys_ConPrint(uint idx, const char *text, int clflags) return; } - win = Sys_MainWindow(); + win = Window_Main(); if(!isValidWindow(win)) return; console = Window_Console(win); @@ -222,25 +222,22 @@ void Sys_ConPrint(uint idx, const char *text, int clflags) void Sys_SetConWindowCmdLine(uint idx, const char* text, uint cursorPos, int flags) { - Window* win; - - win = Sys_Window(idx - 1); + Window* win = Window_ByIndex(idx); if(!win || Window_Type(win) != WT_CONSOLE || !isValidWindow(win)) return; - assert(win == Sys_MainWindow()); + assert(win == Window_Main()); setConWindowCmdLine(idx, text, cursorPos, flags); } -void Sys_ConSetTitle(uint idx, const char* title) +void ConsoleWindow_SetTitle(const Window* window, const char* title) { - Window* window = Sys_Window(idx); - consolewindow_t* console; + const consolewindow_t* console; if(!isValidWindow(window)) return; - console = Window_Console(window); + console = Window_ConsoleConst(window); // The background will also be in reverse. wbkgdset(console->winTitle, ' ' | A_REVERSE); @@ -317,7 +314,7 @@ Window* Sys_ConInit(const char* title) Sys_ConInputInit(); } - return Sys_MainWindow(); + return Window_Main(); } static void Sys_ConInputShutdown(void) @@ -330,14 +327,14 @@ static void Sys_ConInputShutdown(void) void Sys_ConShutdown(uint idx) { - Window* window = Sys_Window(idx); + Window* window = Window_ByIndex(idx); consolewindow_t* console; if(!isValidWindow(window)) return; console = Window_Console(window); // We should only have one window. - assert(window == Sys_MainWindow()); + assert(window == Window_Main()); // Delete windows and shut down curses. delwin(console->winTitle); diff --git a/doomsday/engine/win32/src/dd_winit.c b/doomsday/engine/win32/src/dd_winit.c index 1f6cf60fd4..14056a837a 100644 --- a/doomsday/engine/win32/src/dd_winit.c +++ b/doomsday/engine/win32/src/dd_winit.c @@ -411,13 +411,11 @@ static BOOL createMainWindow(int lnCmdShow) Point2Raw origin = { 0, 0 }; Size2Raw size = { 640, 480 }; DD_ComposeMainWindowTitle(buf); - mainWindowIdx = Sys_CreateWindow(&app, &origin, &size, 32, 0, - (isDedicated ? WT_CONSOLE : WT_NORMAL), buf, &lnCmdShow); + mainWindowIdx = Window_Create(&app, &origin, &size, 32, 0, + (isDedicated ? WT_CONSOLE : WT_NORMAL), buf, &lnCmdShow); return mainWindowIdx != 0; } -//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) - boolean DD_Win32_Init(void) { BOOL failed = TRUE;