[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog gui/fb.cpp
From: |
Udo Giacomozzi |
Subject: |
[Gnash-commit] gnash ChangeLog gui/fb.cpp |
Date: |
Mon, 19 Feb 2007 18:14:03 +0000 |
CVSROOT: /cvsroot/gnash
Module name: gnash
Changes by: Udo Giacomozzi <udog> 07/02/19 18:14:03
Modified files:
. : ChangeLog
gui : fb.cpp
Log message:
add support for eGalax/eTurbotouch touchscreens; use persistent buffer
for PS/2 mice also
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2395&r2=1.2396
http://cvs.savannah.gnu.org/viewcvs/gnash/gui/fb.cpp?cvsroot=gnash&r1=1.24&r2=1.25
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/gnash/gnash/ChangeLog,v
retrieving revision 1.2395
retrieving revision 1.2396
diff -u -b -r1.2395 -r1.2396
--- ChangeLog 19 Feb 2007 15:37:01 -0000 1.2395
+++ ChangeLog 19 Feb 2007 18:14:03 -0000 1.2396
@@ -1,6 +1,8 @@
2007-02-19 Udo Giacomozzi <address@hidden>
* server/fill_style.h: add missing return type
+ * gui/fb.cpp: add support for eGalax/eTurbotouch touchscreens; use persistent
+ buffer for PS/2 mice also
2007-02-19 Sandro Santilli <address@hidden>
Index: gui/fb.cpp
===================================================================
RCS file: /cvsroot/gnash/gnash/gui/fb.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- gui/fb.cpp 13 Feb 2007 10:25:16 -0000 1.24
+++ gui/fb.cpp 19 Feb 2007 18:14:03 -0000 1.25
@@ -336,7 +336,7 @@
usleep(1); // task switch
- check_mouse();
+ check_mouse(); // TODO: Exit delay loop on mouse events!
struct timeval tv;
if (!gettimeofday(&tv, NULL))
@@ -465,6 +465,34 @@
fflush(stdout);*/
}
+void FBGui::read_mouse_data()
+{
+ if (input_fd<0) return; // no mouse available
+
+ int count;
+
+ unsigned char *ptr;
+
+ ptr = mouse_buf + mouse_buf_size;
+
+ count = read(input_fd, mouse_buf + mouse_buf_size,
+ sizeof(mouse_buf) - mouse_buf_size);
+
+ if (count<=0) return;
+
+ /*
+ printf("read data: ");
+ int i;
+ for (i=0; i<count; i++)
+ printf("%02x ", ptr[i]);
+ printf("\n");
+ */
+
+ mouse_buf_size += count;
+
+}
+
+#ifdef USE_MOUSE_PS2
bool FBGui::mouse_command(unsigned char cmd, unsigned char *buf, int count) {
int n;
@@ -482,7 +510,9 @@
return true;
} //command()
+#endif
+#ifdef USE_MOUSE_PS2
bool FBGui::init_mouse()
{
@@ -490,11 +520,10 @@
// Try to open mouse device, be error tolerant (FD is kept open all the time)
- // TODO: Make device name configurable
- input_fd = open("/dev/input/mice", O_RDWR);
+ input_fd = open(MOUSE_DEVICE, O_RDWR);
if (input_fd<0) {
- log_msg("Could not open /dev/input/mice: %s", strerror(errno));
+ log_msg("Could not open " MOUSE_DEVICE ": %s", strerror(errno));
return false;
}
@@ -535,33 +564,46 @@
return true;
}
+#endif
+#ifdef USE_MOUSE_PS2
void FBGui::check_mouse()
{
if (input_fd<0) return; // no mouse available
- unsigned char buf[3];
int i;
int xmove, ymove, btn, btn_changed;
- while ( read(input_fd, buf, 1) == 1 ) {
+ read_mouse_data();
+
+ // resync
+ int pos = -1;
+ for (i=0; i<mouse_buf_size; i++)
+ if (mouse_buf[i] & 8) { // bit 3 must be high for the first byte
+ pos = i;
+ break;
+ }
+ if (pos<0) return; // no sync or no data
- if (buf[0] & 8 == 0) continue; // bit 3 must be high for the first byte
+ if (pos>0) {
+ // remove garbage:
+ memmove(mouse_buf, mouse_buf + pos, mouse_buf_size - pos);
+ mouse_buf_size -= pos;
+ }
- if (read(input_fd, buf+1, 2) != 2) continue; // expect total 3 bytes
- // TODO: The method above can loose data. Use a permanent buffer instead!
+ if (mouse_buf_size >= 3) {
- xmove = buf[1];
- ymove = buf[2];
- btn = buf[0] & 1;
+ xmove = mouse_buf[1];
+ ymove = mouse_buf[2];
+ btn = mouse_buf[0] & 1;
- if (buf[0] & 0x10) xmove = -(256-xmove);
- if (buf[0] & 0x20) ymove = -(256-ymove);
+ if (mouse_buf[0] & 0x10) xmove = -(256-xmove);
+ if (mouse_buf[0] & 0x20) ymove = -(256-ymove);
ymove *= -1; // vertical movement is upside-down
- //log_msg("x/y %d/%d btn %d", xmove, ymove, btn);
+ log_msg("x/y %d/%d btn %d", xmove, ymove, btn);
// movement
mouse_x += xmove;
@@ -586,10 +628,118 @@
//log_msg("mouse click! %d", btn);
}
+ // remove from buffer
+ pos=3;
+ memmove(mouse_buf, mouse_buf + pos, mouse_buf_size - pos);
+ mouse_buf_size -= pos;
+
}
}
+#endif
+
+#ifdef USE_MOUSE_ETT
+bool FBGui::init_mouse()
+{
+ // Try to open mouse device, be error tolerant (FD is kept open all the time)
+ input_fd = open(MOUSE_DEVICE, O_RDWR);
+
+ if (input_fd<0) {
+ log_msg("Could not open " MOUSE_DEVICE ": %s", strerror(errno));
+ return false;
+ }
+
+ unsigned char buf[10], byte;
+
+ if (fcntl(input_fd, F_SETFL, fcntl(input_fd, F_GETFL) | O_NONBLOCK)<0) {
+ log_error("Could not set non-blocking mode for touchpad device: %s",
strerror(errno));
+ close(input_fd);
+ input_fd=-1;
+ return false;
+ }
+
+ // Clear input buffer
+ while ( read(input_fd, buf, sizeof buf) > 0 ) { }
+
+ mouse_buf_size=0;
+
+ log_msg("Touchpad enabled.");
+ return true;
+}
+#endif
+
+#ifdef USE_MOUSE_ETT
+void FBGui::check_mouse()
+{
+ if (input_fd<0) return; // no mouse available
+
+ read_mouse_data();
+
+ // resync
+ int pos = -1;
+ int i;
+ for (i=0; i<mouse_buf_size; i++)
+ if (mouse_buf[i] & 0x80) {
+ pos = i;
+ break;
+ }
+ if (pos<0) return; // no sync or no data
+
+ if (pos>0) {
+ //printf("touchscreen: removing %d bytes garbage!\n", pos);
+ memmove(mouse_buf, mouse_buf + pos, mouse_buf_size - pos);
+ mouse_buf_size -= pos;
+ }
+
+ // packet complete?
+ while (mouse_buf_size > 4) {
+ /*
+ eTurboTouch version??
+ mouse_btn = ((mouse_buf[0] >> 4) & 1);
+ mouse_x = (mouse_buf[1] << 4) | (mouse_buf[2] >> 3);
+ mouse_y = (mouse_buf[3] << 4) | (mouse_buf[4] >> 3);
+ */
+
+ int new_btn = (mouse_buf[0] & 1);
+ int new_x = (mouse_buf[1] << 7) | (mouse_buf[2]);
+ int new_y = (mouse_buf[3] << 7) | (mouse_buf[4]);
+
+ /*
+ printf("touchscreen: %02x %02x %02x %02x %02x | status %d, pos: %d/%d\n",
+ mouse_buf[0], mouse_buf[1], mouse_buf[2], mouse_buf[3], mouse_buf[4],
+ new_btn, new_x, new_y);
+ */
+
+
+ new_x = ((new_x*1.0) - 355) / (1702 - 355) * 1536 + 256;
+ new_y = ((new_y*1.0) - 482) / (1771 - 482) * 1536 + 256;
+
+
+ new_x = new_x * m_stage_width / 2048;
+ new_y = (2048-new_y) * m_stage_height / 2048;
+
+ if ((new_x!=mouse_x) || (new_y!=mouse_y)) {
+ float xscale = getXScale();
+ float yscale = getYScale();
+ mouse_x = new_x;
+ mouse_y = new_y;
+ notify_mouse_moved(int(mouse_x / xscale), int(mouse_y / yscale));
+ }
+
+ if (new_btn != mouse_btn) {
+ mouse_btn = new_btn;
+ notify_mouse_clicked(mouse_btn, 1); // mask=?
+ }
+
+ // remove from buffer
+ pos=5;
+ memmove(mouse_buf, mouse_buf + pos, mouse_buf_size - pos);
+ mouse_buf_size -= pos;
+ }
+
+}
+#endif
// end of namespace gnash
}