1
0
mirror of git://projects.qi-hardware.com/gmenu2x.git synced 2024-07-15 09:23:11 +03:00
gmenu2x/src/touchscreen.cpp
Maarten ter Huurne 944ab86f9c Cleanup of touch screen code.
Initialize in constructor and clean up in destructor instead of having separate init() and deinit() methods.
Don't close file descriptor if open failed (ts_fd == -1).
Renamed initialized() to available(), since it tests whether the touch screen was found, not whether an initialization was attempted.
Improved code layout and minor other cleanups.
2011-12-23 12:30:15 +01:00

127 lines
3.3 KiB
C++

/***************************************************************************
* Copyright (C) 2006 by Massimiliano Torromeo *
* massimiliano.torromeo@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "touchscreen.h"
#include <fcntl.h>
#include <unistd.h>
Touchscreen::Touchscreen() {
calibrated = false;
wasPressed = false;
_handled = false;
x = 0;
y = 0;
startX = 0;
startY = 0;
event.x = 0;
event.y = 0;
event.pressure = 0;
#ifdef PLATFORM_GP2X
ts_fd = open("/dev/touchscreen/wm97xx", O_RDONLY|O_NOCTTY);
#else
ts_fd = 0;
#endif
}
Touchscreen::~Touchscreen() {
if (ts_fd > 0) {
close(ts_fd);
}
}
void Touchscreen::calibrate() {
if (event.pressure == 0) {
calibX = ((event.x - 200) * 320 / 3750) / 4;
calibY = (((event.y - 200) * 240 / 3750)) / 4;
calibrated = true;
}
}
bool Touchscreen::poll() {
wasPressed = pressed();
#ifdef PLATFORM_GP2X
read(ts_fd, &event, sizeof(TS_EVENT));
if (!calibrated) calibrate();
if (event.pressure > 0) {
x = ((event.x - 200) * 320 / 3750) - calibX;
y = (240 - ((event.y - 200) * 240 / 3750)) - calibY;
}
#else
SDL_PumpEvents();
int mx, my;
if (SDL_GetMouseState(&mx,&my) && SDL_BUTTON(1)) {
x = mx;
y = my;
event.pressure = 1;
} else {
event.pressure = 0;
}
#endif
_handled = false;
if (!wasPressed && pressed()) {
startX = x;
startY = y;
}
return pressed();
}
bool Touchscreen::handled() {
return _handled;
}
void Touchscreen::setHandled() {
wasPressed = false;
_handled = true;
}
bool Touchscreen::pressed() {
return !_handled && event.pressure > 0;
}
bool Touchscreen::released() {
return !pressed() && wasPressed;
}
bool Touchscreen::inRect(SDL_Rect r) {
return !_handled &&
(y >= r.y) && (y <= r.y + r.h) && (x >= r.x) && (x <= r.x + r.w);
}
bool Touchscreen::inRect(int x, int y, int w, int h) {
SDL_Rect rect = { x, y, w, h };
return inRect(rect);
}
bool Touchscreen::startedInRect(SDL_Rect r) {
return !_handled &&
(startY >= r.y) && (startY <= r.y + r.h) &&
(startX >= r.x) && (startX <= r.x + r.w);
}
bool Touchscreen::startedInRect(int x, int y, int w, int h) {
SDL_Rect rect = { x, y, w, h };
return startedInRect(rect);
}