00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include "guichan/glut/glutinput.hpp"
00062 #include "guichan/exception.hpp"
00063
00064 namespace gcn
00065 {
00066
00067 GLUTInput::GLUTInput()
00068 {
00069 }
00070
00071 bool GLUTInput::isKeyQueueEmpty()
00072 {
00073 return mKeyInputQueue.empty();
00074 }
00075
00076 KeyInput GLUTInput::dequeueKeyInput()
00077 {
00078 KeyInput keyInput;
00079
00080 if (mKeyInputQueue.empty())
00081 {
00082 throw GCN_EXCEPTION("The queue is empty.");
00083 }
00084
00085 keyInput = mKeyInputQueue.front();
00086 mKeyInputQueue.pop();
00087
00088 return keyInput;
00089 }
00090
00091 bool GLUTInput::isMouseQueueEmpty()
00092 {
00093 return mMouseInputQueue.empty();
00094 }
00095
00096 MouseInput GLUTInput::dequeueMouseInput()
00097 {
00098 MouseInput mouseInput;
00099
00100 if (mMouseInputQueue.empty())
00101 {
00102 throw GCN_EXCEPTION("The queue is empty.");
00103 }
00104
00105 mouseInput = mMouseInputQueue.front();
00106 mMouseInputQueue.pop();
00107
00108 return mouseInput;
00109 }
00110
00111 void GLUTInput::pushKeyDownInput(unsigned char key)
00112 {
00113 KeyInput keyInput;
00114 keyInput.setKey(convertKeyCharacter(key));
00115 keyInput.setType(KeyInput::PRESS);
00116 mKeyInputQueue.push(keyInput);
00117 }
00118
00119 void GLUTInput::pushKeyUpInput(unsigned char key)
00120 {
00121 KeyInput keyInput;
00122 keyInput.setKey(convertKeyCharacter(key));
00123 keyInput.setType(KeyInput::RELEASE);
00124 mKeyInputQueue.push(keyInput);
00125 }
00126
00127 void GLUTInput::pushSpecialDownInput(unsigned char key)
00128 {
00129 KeyInput keyInput;
00130 keyInput.setKey(convertSpecialCharacter(key));
00131 keyInput.setType(KeyInput::PRESS);
00132 mKeyInputQueue.push(keyInput);
00133
00134 }
00135
00136 void GLUTInput::pushSpecialUpInput(unsigned char key)
00137 {
00138 KeyInput keyInput;
00139 keyInput.setKey(convertSpecialCharacter(key));
00140 keyInput.setType(KeyInput::RELEASE);
00141 mKeyInputQueue.push(keyInput);
00142 }
00143
00144 void GLUTInput::pushMouseInput(int button, int state, int x, int y)
00145 {
00146 MouseInput mouseInput;
00147 mouseInput.x = x;
00148 mouseInput.y = y;
00149 mouseInput.setButton(convertMouseButton(button));
00150
00151 if (state == GLUT_DOWN)
00152 {
00153 mouseInput.setType(MouseInput::PRESS);
00154 }
00155 else
00156 {
00157 mouseInput.setType(MouseInput::RELEASE);
00158 }
00159
00160 mMouseInputQueue.push(mouseInput);
00161 }
00162
00163 void GLUTInput::pushMotionInput(int x, int y)
00164 {
00165 MouseInput mouseInput;
00166 mouseInput.x = x;
00167 mouseInput.y = y;
00168 mouseInput.setButton(MouseInput::EMPTY);
00169 mouseInput.setType(MouseInput::MOTION);
00170 mMouseInputQueue.push(mouseInput);
00171 }
00172
00173 void GLUTInput::pushPassiveMotionInput(int x, int y)
00174 {
00175 pushMotionInput(x, y);
00176 }
00177
00178 Key GLUTInput::convertKeyCharacter(unsigned char key)
00179 {
00180 int value = 0;
00181 Key gcnKey;
00182
00183 value = (int)key;
00184
00185 switch(key)
00186 {
00187 case 8:
00188 value = Key::BACKSPACE;
00189 break;
00190 case 13:
00191 value = Key::ENTER;
00192 break;
00193 case 27:
00194 value = Key::ESCAPE;
00195 break;
00196 case 127:
00197 value = Key::DELETE;
00198 break;
00199 }
00200
00201 int modifiers = glutGetModifiers();
00202 gcnKey.setShiftPressed(modifiers & GLUT_ACTIVE_SHIFT);
00203 gcnKey.setControlPressed(modifiers & GLUT_ACTIVE_CTRL);
00204 gcnKey.setAltPressed(modifiers & GLUT_ACTIVE_ALT);
00205
00206 gcnKey.setValue(value);
00207
00208 return gcnKey;
00209 }
00210
00211 Key GLUTInput::convertSpecialCharacter(unsigned char key)
00212 {
00213 int value = 0;
00214 Key gcnKey;
00215
00216 value = (int)key;
00217
00218 switch(key)
00219 {
00220 case GLUT_KEY_UP:
00221 value = Key::UP;
00222 break;
00223 case GLUT_KEY_DOWN:
00224 value = Key::DOWN;
00225 break;
00226 case GLUT_KEY_RIGHT:
00227 value = Key::RIGHT;
00228 break;
00229 case GLUT_KEY_LEFT:
00230 value = Key::LEFT;
00231 break;
00232 case GLUT_KEY_F1:
00233 value = Key::F1;
00234 break;
00235 case GLUT_KEY_F2:
00236 value = Key::F2;
00237 break;
00238 case GLUT_KEY_F3:
00239 value = Key::F3;
00240 break;
00241 case GLUT_KEY_F4:
00242 value = Key::F4;
00243 break;
00244 case GLUT_KEY_F5:
00245 value = Key::F5;
00246 break;
00247 case GLUT_KEY_F6:
00248 value = Key::F6;
00249 break;
00250 case GLUT_KEY_F7:
00251 value = Key::F7;
00252 break;
00253 case GLUT_KEY_F8:
00254 value = Key::F8;
00255 break;
00256 case GLUT_KEY_F9:
00257 value = Key::F9;
00258 break;
00259 case GLUT_KEY_F10:
00260 value = Key::F10;
00261 break;
00262 case GLUT_KEY_F11:
00263 value = Key::F11;
00264 break;
00265 case GLUT_KEY_F12:
00266 value = Key::F12;
00267 break;
00268 case GLUT_KEY_PAGE_UP:
00269 value = Key::PAGE_UP;
00270 break;
00271 case GLUT_KEY_PAGE_DOWN:
00272 value = Key::PAGE_DOWN;
00273 break;
00274 case GLUT_KEY_HOME:
00275 value = Key::HOME;
00276 break;
00277 case GLUT_KEY_END:
00278 value = Key::END;
00279 break;
00280 case GLUT_KEY_INSERT:
00281 value = Key::INSERT;
00282 break;
00283 default:
00284 break;
00285 }
00286
00287 int modifiers = glutGetModifiers();
00288 gcnKey.setShiftPressed(modifiers & GLUT_ACTIVE_SHIFT);
00289 gcnKey.setControlPressed(modifiers & GLUT_ACTIVE_CTRL);
00290 gcnKey.setAltPressed(modifiers & GLUT_ACTIVE_ALT);
00291
00292 gcnKey.setValue(value);
00293
00294 return gcnKey;
00295 }
00296
00297 int GLUTInput::convertMouseButton(int button)
00298 {
00299 switch (button)
00300 {
00301 case GLUT_LEFT_BUTTON:
00302 return MouseInput::LEFT;
00303 break;
00304 case GLUT_RIGHT_BUTTON:
00305 return MouseInput::RIGHT;
00306 break;
00307 case GLUT_MIDDLE_BUTTON:
00308 return MouseInput::MIDDLE;
00309 break;
00310 }
00311
00312 throw GCN_EXCEPTION("Unknown GLUT mouse type.");
00313
00314 return 0;
00315 }
00316 }