瀏覽代碼

WindowSDL GL driver support and more error checks

Thomas Buck 11 年之前
父節點
當前提交
f50d7d6c3a
共有 3 個檔案被更改,包括 59 行新增7 行删除
  1. 2
    0
      include/Window.h
  2. 3
    0
      include/WindowSDL.h
  3. 54
    7
      src/WindowSDL.cpp

+ 2
- 0
include/Window.h 查看文件

@@ -25,6 +25,8 @@ public:
25 25
      */
26 26
     virtual ~Window();
27 27
 
28
+    virtual void setDriver(const char *driver) = 0;
29
+
28 30
     virtual void setSize(unsigned int width, unsigned int height) = 0;
29 31
 
30 32
     virtual void setFullscreen(bool fullscreen) = 0;

+ 3
- 0
include/WindowSDL.h 查看文件

@@ -28,6 +28,8 @@ public:
28 28
      */
29 29
     virtual ~WindowSDL();
30 30
 
31
+    virtual void setDriver(const char *driver);
32
+
31 33
     virtual void setSize(unsigned int width, unsigned int height);
32 34
 
33 35
     virtual void setFullscreen(bool fullscreen);
@@ -40,6 +42,7 @@ public:
40 42
 
41 43
 private:
42 44
     bool mInit;
45
+    char *mDriver;
43 46
     unsigned int mWidth;
44 47
     unsigned int mHeight;
45 48
     bool mFullscreen;

+ 54
- 7
src/WindowSDL.cpp 查看文件

@@ -5,13 +5,16 @@
5 5
  * \author xythobuz
6 6
  */
7 7
 
8
+#include <cstdio>
8 9
 #include <assert.h>
9 10
 
10 11
 #include "config.h"
12
+#include "utils/strings.h"
11 13
 #include "WindowSDL.h"
12 14
 
13 15
 WindowSDL::WindowSDL() {
14 16
     mInit = false;
17
+    mDriver = NULL;
15 18
     mWidth = DEFAULT_WIDTH;
16 19
     mHeight = DEFAULT_HEIGHT;
17 20
     mFullscreen = false;
@@ -21,7 +24,15 @@ WindowSDL::WindowSDL() {
21 24
 }
22 25
 
23 26
 WindowSDL::~WindowSDL() {
27
+    if (mDriver)
28
+        delete [] mDriver;
29
+}
30
+
31
+void WindowSDL::setDriver(const char *driver) {
32
+    assert(driver != NULL);
33
+    assert(driver[0] != '\0');
24 34
 
35
+    mDriver = bufferString("%s", driver);
25 36
 }
26 37
 
27 38
 void WindowSDL::setSize(unsigned int width, unsigned int height) {
@@ -62,25 +73,59 @@ void WindowSDL::setMousegrab(bool grab) {
62 73
 }
63 74
 
64 75
 int WindowSDL::initialize() {
65
-    SDL_Init(SDL_INIT_VIDEO);
76
+    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
77
+        printf("SDL Error: %s\n", SDL_GetError());
78
+        return -1;
79
+    }
66 80
 
67
-    mInit = true;
81
+#ifndef __APPLE__
82
+    assert(mDriver != NULL);
83
+    assert(mDriver[0] != '\0');
84
+    if (SDL_GL_LoadLibrary(mDriver) < 0) {
85
+        SDL_ClearError();
86
+        if (SDL_GL_LoadLibrary("libGL.so") < 0) {
87
+            SDL_ClearError();
88
+            if (SDL_GL_LoadLibrary("libGL.so.1") < 0) {
89
+                printf("Could not load OpenGL driver!\n");
90
+                printf("SDL Error: %s\n", SDL_GetError());
91
+                return -2;
92
+            }
93
+        }
94
+    }
95
+#endif
68 96
 
69 97
     int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
70 98
     if (mFullscreen)
71 99
         flags |= SDL_WINDOW_FULLSCREEN;
72 100
 
101
+    mInit = true;
73 102
     setMousegrab(mMousegrab);
74 103
 
75
-    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
76
-    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
77
-    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
78
-    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
79
-    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
104
+    if ((SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5) != 0)
105
+        || (SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5) != 0)
106
+        || (SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5) != 0)
107
+        || (SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16) != 0)
108
+        || (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) != 0)) {
109
+        printf("SDL Error: %s\n", SDL_GetError());
110
+        mInit = false;
111
+        return -3;
112
+    }
80 113
 
81 114
     mWindow = SDL_CreateWindow(VERSION, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
82 115
                 mWidth, mHeight, flags);
116
+    if (mWindow == NULL) {
117
+        printf("SDL Error: %s\n", SDL_GetError());
118
+        mInit = false;
119
+        return -4;
120
+    }
121
+
83 122
     mGLContext = SDL_GL_CreateContext(mWindow);
123
+    if (mGLContext == NULL) {
124
+        printf("SDL Error: %s\n", SDL_GetError());
125
+        mInit = false;
126
+        return -5;
127
+    }
128
+
84 129
     setSize(mWidth, mHeight);
85 130
 
86 131
     return 0;
@@ -90,5 +135,7 @@ void WindowSDL::writeString(WindowString *s) {
90 135
     assert(s != NULL);
91 136
     assert(s->text != NULL);
92 137
     assert(mInit == true);
138
+
139
+
93 140
 }
94 141
 

Loading…
取消
儲存