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