146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_QWin.h" 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <qapplication.h> 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <qdirectpainter_qws.h> 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2846be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerscreenRotationT screenRotation = SDL_QT_NO_ROTATION; 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_QWin::SDL_QWin(const QSize& size) 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner : QWidget(0, "SDL_main"), my_painter(0), my_image(0), 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_inhibit_resize(false), my_mouse_pos(-1,-1), my_flags(0), 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_has_fullscreen(false), my_locked(0) 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner setBackgroundMode(NoBackground); 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3846be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_QWin::~SDL_QWin() { 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Nothing to do yet. 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_image) { 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner delete my_image; 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::setImage(QImage *image) { 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( my_image ) { 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner delete my_image; 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_image = image; 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // setFixedSize(image->size()); 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::resizeEvent(QResizeEvent *e) { 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(size() != qApp->desktop()->size()) { 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Widget is not the correct size, so do the fullscreen magic 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_has_fullscreen = false; 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner enableFullscreen(); 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_inhibit_resize) { 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_inhibit_resize = false; 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateResize(e->size().width(), e->size().height()); 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::focusInEvent(QFocusEvent *) { 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Always do it here, no matter the size. 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner enableFullscreen(); 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(true, SDL_APPINPUTFOCUS); 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::focusOutEvent(QFocusEvent *) { 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_has_fullscreen = false; 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(false, SDL_APPINPUTFOCUS); 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::closeEvent(QCloseEvent *e) { 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateQuit(); 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner e->ignore(); 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::setMousePos(const QPoint &pos) { 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_image->width() == height()) { 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (screenRotation == SDL_QT_ROTATION_90) 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_mouse_pos = QPoint(height()-pos.y(), pos.x()); 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (screenRotation == SDL_QT_ROTATION_270) 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_mouse_pos = QPoint(pos.y(), width()-pos.x()); 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_mouse_pos = pos; 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::mouseMoveEvent(QMouseEvent *e) { 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Qt::ButtonState button = e->button(); 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int sdlstate = 0; 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( (button & Qt::LeftButton)) { 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlstate |= SDL_BUTTON_LMASK; 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( (button & Qt::RightButton)) { 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlstate |= SDL_BUTTON_RMASK; 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( (button & Qt::MidButton)) { 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlstate |= SDL_BUTTON_MMASK; 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner setMousePos(e->pos()); 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseMotion(sdlstate, 0, my_mouse_pos.x(), my_mouse_pos.y()); 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::mousePressEvent(QMouseEvent *e) { 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mouseMoveEvent(e); 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Qt::ButtonState button = e->button(); 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_PRESSED, 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (button & Qt::LeftButton) ? 1 : 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((button & Qt::RightButton) ? 2 : 3), 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_mouse_pos.x(), my_mouse_pos.y()); 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::mouseReleaseEvent(QMouseEvent *e) { 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner setMousePos(e->pos()); 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Qt::ButtonState button = e->button(); 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_RELEASED, 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (button & Qt::LeftButton) ? 1 : 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((button & Qt::RightButton) ? 2 : 3), 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_mouse_pos.x(), my_mouse_pos.y()); 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_mouse_pos = QPoint(-1, -1); 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic inline void 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnergs_fastRotateBlit_3 ( unsigned short *fb, 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned short *bits, 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const QRect& rect ) 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // FIXME: this only works correctly for 240x320 displays 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int startx, starty; 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, height; 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner startx = rect.left() >> 1; 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner starty = rect.top() >> 1; 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = ((rect.right() - rect.left()) >> 1) + 2; 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = ((rect.bottom() - rect.top()) >> 1) + 2; 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if((startx+width) > 120) { 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = 120 - startx; // avoid horizontal overflow 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if((starty+height) > 160) { 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = 160 - starty; // avoid vertical overflow 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ulong *sp1, *sp2, *dp1, *dp2; 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ulong stop, sbot, dtop, dbot; 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp1 = (ulong*)bits + startx + starty*240; 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp2 = sp1 + 120; 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp1 = (ulong *)fb + (159 - starty) + startx*320; 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp2 = dp1 + 160; 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rowadd = (-320*width) - 1; 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rowadd2 = 240 - width; 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // transfer in cells of 2x2 pixels in words 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (int y=0; y<height; y++) { 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (int x=0; x<width; x++) { 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // read source pixels 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner stop = *sp1; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sbot = *sp2; 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // rotate pixels 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dtop = (sbot & 0xffff) + ((stop & 0xffff)<<16); 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dbot = ((sbot & 0xffff0000)>>16) + (stop & 0xffff0000); 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // write to framebuffer 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dp1 = dtop; 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dp2 = dbot; 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // update source ptrs 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp1++; sp2++; 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // update dest ptrs - 2 pix at a time 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp1 += 320; 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp2 += 320; 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // adjust src ptrs - skip a row as we work in pairs 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp1 += rowadd2; 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp2 += rowadd2; 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // adjust dest ptrs for rotation 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp1 += rowadd; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp2 += rowadd; 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic inline void 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnergs_fastRotateBlit_1 ( unsigned short *fb, 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned short *bits, 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const QRect& rect ) { 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // FIXME: this only works correctly for 240x320 displays 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int startx, starty; 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, height; 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner startx = rect.left() >> 1; 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner starty = rect.top() >> 1; 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = ((rect.right() - rect.left()) >> 1) + 2; 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = ((rect.bottom() - rect.top()) >> 1) + 2; 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if((startx+width) > 120) { 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = 120 - startx; // avoid horizontal overflow 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if((starty+height) > 160) { 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = 160 - starty; // avoid vertical overflow 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ulong *sp1, *sp2, *dp1, *dp2; 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ulong stop, sbot, dtop, dbot; 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += 320*239; // Move "fb" to top left corner 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp1 = (ulong*)bits + startx + starty*240; 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp2 = sp1 + 120; 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp1 = (ulong*)fb - startx * 320 - starty; 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp2 = dp1 - 160; 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rowadd = (320*width) + 1; 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rowadd2 = 240 - width; 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // transfer in cells of 2x2 pixels in words 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (int y=0; y<height; y++) { 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (int x=0; x<width; x++) { 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // read 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner stop = *sp1; 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sbot = *sp2; 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // rotate 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dtop = (stop & 0xffff) + ((sbot & 0xffff)<<16); 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dbot = ((stop & 0xffff0000)>>16) + (sbot & 0xffff0000); 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // write 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dp1 = dtop; 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dp2 = dbot; 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // update source ptrs 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp1++; sp2++; 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // update dest ptrs - 2 pix at a time 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp1 -= 320; 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp2 -= 320; 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // adjust src ptrs - skip a row as we work in pairs 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp1 += rowadd2; 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sp2 += rowadd2; 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // adjust dest ptrs for rotation 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp1 += rowadd; 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dp2 += rowadd; 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// desktop, SL-A300 etc 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbool SDL_QWin::repaintRotation0(const QRect& rect) { 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_image->width() == width()) { 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchar *fb = (uchar*)my_painter->frameBuffer(); 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchar *buf = (uchar*)my_image->bits(); 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(rect == my_image->rect()) { 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(fb, buf, width()*height()*2); 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int h = rect.height(); 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int wd = rect.width()<<1; 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int fblineadd = my_painter->lineStep(); 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int buflineadd = my_image->bytesPerLine(); 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += (rect.left()<<1) + rect.top() * my_painter->lineStep(); 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buf += (rect.left()<<1) + rect.top() * my_image->bytesPerLine(); 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while(h--) { 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(fb, buf, wd); 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += fblineadd; 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buf += buflineadd; 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return false; // FIXME: Landscape 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef __i386__ 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_painter->fillRect( rect, QBrush( Qt::NoBrush ) ); 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return true; 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Sharp Zaurus SL-5500 etc 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbool SDL_QWin::repaintRotation3(const QRect& rect) { 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_image->width() == width()) { 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ushort *fb = (ushort*)my_painter->frameBuffer(); 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ushort *buf = (ushort*)my_image->bits(); 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner gs_fastRotateBlit_3(fb, buf, rect); 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // landscape mode 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (screenRotation == SDL_QT_ROTATION_90) { 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchar *fb = (uchar*)my_painter->frameBuffer(); 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchar *buf = (uchar*)my_image->bits(); 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(rect == my_image->rect()) { 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(fb, buf, width()*height()*2); 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int h = rect.height(); 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int wd = rect.width()<<1; 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int fblineadd = my_painter->lineStep(); 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int buflineadd = my_image->bytesPerLine(); 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += (rect.left()<<1) + rect.top() * my_painter->lineStep(); 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buf += (rect.left()<<1) + rect.top() * my_image->bytesPerLine(); 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while(h--) { 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(fb, buf, wd); 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += fblineadd; 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buf += buflineadd; 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else if (screenRotation == SDL_QT_ROTATION_270) { 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int h = rect.height(); 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int wd = rect.width(); 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int fblineadd = my_painter->lineStep() - (rect.width() << 1); 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int buflineadd = my_image->bytesPerLine() - (rect.width() << 1); 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int w; 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchar *fb = (uchar*)my_painter->frameBuffer(); 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchar *buf = (uchar*)my_image->bits(); 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += ((my_painter->width() - (rect.top() + rect.height())) * 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_painter->lineStep()) + ((my_painter->height() - ((rect.left() + 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect.width()))) << 1); 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buf += my_image->bytesPerLine() * (rect.top() + rect.height()) - 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (((my_image->width() - (rect.left() + rect.width())) << 1) + 2); 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while(h--) { 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner w = wd; 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while(w--) *((unsigned short*)fb)++ = *((unsigned short*)buf)--; 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fb += fblineadd; 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buf -= buflineadd; 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return true; 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// ipaq 3800... 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbool SDL_QWin::repaintRotation1(const QRect& rect) { 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_image->width() == width()) { 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ushort *fb = (ushort*)my_painter->frameBuffer(); 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ushort *buf = (ushort*)my_image->bits(); 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner gs_fastRotateBlit_1(fb, buf, rect); 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return false; // FIXME: landscape mode 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return true; 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::repaintRect(const QRect& rect) { 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(!my_painter || !rect.width() || !rect.height()) { 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(QPixmap::defaultDepth() == 16) { 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(my_painter->transformOrientation()) { 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 3: 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(repaintRotation3(rect)) { return; } 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 1: 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(repaintRotation1(rect)) { return; } 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0: 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(repaintRotation0(rect)) { return; } 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_painter->drawImage(rect.topLeft(), *my_image, rect); 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This paints the current buffer to the screen, when desired. 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::paintEvent(QPaintEvent *ev) { 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_image) { 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lockScreen(true); 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner repaintRect(ev->rect()); 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unlockScreen(); 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Function to translate a keyboard transition and queue the key event 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * This should probably be a table although this method isn't exactly 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * slow. 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::QueueKey(QKeyEvent *e, int pressed) 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_keysym keysym; 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int scancode = e->key(); 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set the keysym information */ 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(scancode >= 'A' && scancode <= 'Z') { 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Qt sends uppercase, SDL wants lowercase 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.sym = static_cast<SDLKey>(scancode + 32); 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else if(scancode >= 0x1000) { 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Special keys 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(scancode) { 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Escape: scancode = SDLK_ESCAPE; break; 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Tab: scancode = SDLK_TAB; break; 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Backspace: scancode = SDLK_BACKSPACE; break; 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Return: scancode = SDLK_RETURN; break; 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Enter: scancode = SDLK_KP_ENTER; break; 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Insert: scancode = SDLK_INSERT; break; 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Delete: scancode = SDLK_DELETE; break; 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Pause: scancode = SDLK_PAUSE; break; 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Print: scancode = SDLK_PRINT; break; 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_SysReq: scancode = SDLK_SYSREQ; break; 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Home: scancode = SDLK_HOME; break; 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_End: scancode = SDLK_END; break; 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We want the control keys to rotate with the screen 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Left: 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (screenRotation == SDL_QT_ROTATION_90) scancode = SDLK_UP; 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (screenRotation == SDL_QT_ROTATION_270) scancode = SDLK_DOWN; 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else scancode = SDLK_LEFT; 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Up: 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (screenRotation == SDL_QT_ROTATION_90) scancode = SDLK_RIGHT; 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (screenRotation == SDL_QT_ROTATION_270) scancode = SDLK_LEFT; 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else scancode = SDLK_UP; 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Right: 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (screenRotation == SDL_QT_ROTATION_90) scancode = SDLK_DOWN; 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (screenRotation == SDL_QT_ROTATION_270) scancode = SDLK_UP; 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else scancode = SDLK_RIGHT; 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Down: 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (screenRotation == SDL_QT_ROTATION_90) scancode = SDLK_LEFT; 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (screenRotation == SDL_QT_ROTATION_270) scancode = SDLK_RIGHT; 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else scancode = SDLK_DOWN; 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Prior: scancode = SDLK_PAGEUP; break; 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Next: scancode = SDLK_PAGEDOWN; break; 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Shift: scancode = SDLK_LSHIFT; break; 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Control: scancode = SDLK_LCTRL; break; 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Meta: scancode = SDLK_LMETA; break; 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Alt: scancode = SDLK_LALT; break; 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_CapsLock: scancode = SDLK_CAPSLOCK; break; 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_NumLock: scancode = SDLK_NUMLOCK; break; 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_ScrollLock: scancode = SDLK_SCROLLOCK; break; 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F1: scancode = SDLK_F1; break; 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F2: scancode = SDLK_F2; break; 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F3: scancode = SDLK_F3; break; 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F4: scancode = SDLK_F4; break; 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F5: scancode = SDLK_F5; break; 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F6: scancode = SDLK_F6; break; 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F7: scancode = SDLK_F7; break; 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F8: scancode = SDLK_F8; break; 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F9: scancode = SDLK_F9; break; 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F10: scancode = SDLK_F10; break; 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F11: scancode = SDLK_F11; break; 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F12: scancode = SDLK_F12; break; 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F13: scancode = SDLK_F13; break; 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F14: scancode = SDLK_F14; break; 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F15: scancode = SDLK_F15; break; 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Super_L: scancode = SDLK_LSUPER; break; 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Super_R: scancode = SDLK_RSUPER; break; 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Menu: scancode = SDLK_MENU; break; 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_Help: scancode = SDLK_HELP; break; 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Qt::Key_F33: 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // FIXME: This is a hack to enable the OK key on 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Zaurii devices. SDLK_RETURN is a suitable key to use 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // since it often is used as such. 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // david@hedbor.org 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner scancode = SDLK_RETURN; 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner scancode = SDLK_UNKNOWN; 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.sym = static_cast<SDLKey>(scancode); 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.sym = static_cast<SDLKey>(scancode); 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.scancode = scancode; 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.mod = KMOD_NONE; 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ButtonState st = e->state(); 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( (st & ShiftButton) ) { keysym.mod = static_cast<SDLMod>(keysym.mod | KMOD_LSHIFT); } 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( (st & ControlButton) ) { keysym.mod = static_cast<SDLMod>(keysym.mod | KMOD_LCTRL); } 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( (st & AltButton) ) { keysym.mod = static_cast<SDLMod>(keysym.mod | KMOD_LALT); } 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( SDL_TranslateUNICODE ) { 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner QChar qchar = e->text()[0]; 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.unicode = qchar.unicode(); 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym.unicode = 0; 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* NUMLOCK and CAPSLOCK are implemented as double-presses in reality */ 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // if ( (keysym.sym == SDLK_NUMLOCK) || (keysym.sym == SDLK_CAPSLOCK) ) { 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // pressed = 1; 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // } 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Queue the key event */ 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( pressed ) { 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_PRESSED, &keysym); 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_RELEASED, &keysym); 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::setFullscreen(bool fs_on) { 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_has_fullscreen = false; 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner enableFullscreen(); 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::enableFullscreen() { 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure size is correct 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(!my_has_fullscreen) { 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner setFixedSize(qApp->desktop()->size()); 49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // This call is needed because showFullScreen won't work 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // correctly if the widget already considers itself to be fullscreen. 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner showNormal(); 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // This is needed because showNormal() forcefully changes the window 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // style to WSTyle_TopLevel. 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner setWFlags(WStyle_Customize | WStyle_NoBorder); 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Enable fullscreen. 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner showFullScreen(); 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_has_fullscreen = true; 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbool SDL_QWin::lockScreen(bool force) { 50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(!my_painter) { 50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(force || (isVisible() && isActiveWindow())) { 50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_painter = new QDirectPainter(this); 51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return false; 51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_locked++; // Increate lock refcount 51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return true; 51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_QWin::unlockScreen() { 51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(my_locked > 0) { 52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_locked--; // decrease lock refcount; 52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(!my_locked && my_painter) { 52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_painter->end(); 52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner delete my_painter; 52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner my_painter = 0; 52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 528