summaryrefslogtreecommitdiff
path: root/tvision/classes/linux/linuxmouse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tvision/classes/linux/linuxmouse.cc')
-rw-r--r--tvision/classes/linux/linuxmouse.cc142
1 files changed, 142 insertions, 0 deletions
diff --git a/tvision/classes/linux/linuxmouse.cc b/tvision/classes/linux/linuxmouse.cc
new file mode 100644
index 0000000..8871cf1
--- /dev/null
+++ b/tvision/classes/linux/linuxmouse.cc
@@ -0,0 +1,142 @@
+/*****************************************************************************
+
+ Linux mouse routines.
+ Copyright (c) 1996-1998 by Robert Hoehne.
+ Copyright (c) 1999-2002 by Salvador E. Tropea (SET)
+ Covered by the GPL license.
+
+*****************************************************************************/
+#include <tv/configtv.h>
+
+#define Uses_stdlib
+#define Uses_string
+#define Uses_stdio
+#define Uses_time
+#define Uses_signal
+#define Uses_TEvent
+#define Uses_TEventQueue
+#define Uses_TScreen
+#include <tv.h>
+
+// I delay the check to generate as much dependencies as possible
+#if defined(TVOSf_Linux) && defined(HAVE_GPM)
+
+//---------------- GPM version -----------------
+
+#include <termios.h>
+#include <tv/linux/screen.h>
+#include <tv/linux/mouse.h>
+#include <tv/linux/log.h>
+
+extern "C" {
+#include <gpm.h>
+// Kernel 2.6.11 (from Gentoo) seems to need it:
+// Not yet confirmed but doesn't interfere with 2.6.0 headers.
+#include <linux/keyboard.h>
+}
+
+static
+int SetUpGPMConnection()
+{
+ Gpm_Connect conn;
+
+ conn.eventMask = ~0; /* I want all events */
+ conn.defaultMask = 0; /* no default treatment */
+ /* It doesn't report events from GPM when ALT or ALTGR are pressed.
+ I saw it in mc and my friends from BALUG, Ivan and Laszlo bugged me
+ about adding it. Was hyper-easy, no? (SET) */
+ conn.maxMod = ~((1<<KG_ALT) | (1<<KG_ALTGR));
+ conn.minMod = 0;
+ gpm_zerobased = 1; /* coordinates start from zero */
+
+ return Gpm_Open(&conn, 0);
+}
+
+void THWMouseGPM::Resume()
+{
+ if (gpm_fd!=-1)
+ {
+ buttonCount=3;
+ return;
+ }
+ if (SetUpGPMConnection()<0)
+ LOG("no gpm, running without mouse");
+ else
+ {
+ LOG("gpm server version " << Gpm_GetServerVersion(NULL));
+ buttonCount=3;
+ }
+ show();
+}
+
+void THWMouseGPM::Suspend()
+{
+ if (gpm_fd==-1)
+ return;
+ Gpm_Close();
+ gpm_fd=-1;
+ LOG("gpm connection closed");
+}
+
+inline
+int range(int test, int min, int max)
+{
+ return test < min ? min : test > max ? max : test;
+}
+
+void THWMouseGPM::GetEvent(MouseEventType &me)
+{
+ Gpm_Event mev;
+
+ me.buttons=TEventQueue::curMouse.buttons & ~(mbButton4 | mbButton5);
+ me.doubleClick=False;
+ if (!Gpm_Repeat(1) && (Gpm_GetEvent(&mev)==1))
+ {
+ int b=mev.buttons;
+ if ((b & GPM_B_LEFT) && !(mev.type & GPM_UP))
+ me.buttons|= mbLeftButton;
+ else
+ me.buttons&= ~mbLeftButton;
+ if ((b & GPM_B_RIGHT) && !(mev.type & GPM_UP))
+ me.buttons|= mbRightButton;
+ else
+ me.buttons&= ~mbRightButton;
+ if (mev.wdy<0)
+ me.buttons=mbButton5;
+ else
+ if (mev.wdy>0)
+ me.buttons=mbButton4;
+ me.where.x=range(mev.x,0,TScreen::screenWidth-1);
+ me.where.y=range(mev.y,0,TScreen::screenHeight-1);
+ DrawMouse(me.where.x,me.where.y);
+ }
+ else
+ {
+ me.where.x=TEventQueue::curMouse.where.x;
+ me.where.y=TEventQueue::curMouse.where.y;
+ }
+}
+
+void THWMouseGPM::Init()
+{
+ THWMouseUNIX::Init();
+ THWMouse::Resume=Resume;
+ THWMouse::Suspend=Suspend;
+ THWMouse::GetEvent=GetEvent;
+}
+
+THWMouseGPM::~THWMouseGPM()
+{
+}
+
+#else // defined(TVOSf_Linux) && defined(HAVE_GPM)
+
+#if defined(TVOSf_Linux)
+ #include <termios.h>
+#endif
+
+#include <tv/linux/screen.h>
+#include <tv/linux/mouse.h>
+#include <tv/linux/log.h>
+
+#endif // else defined(TVOSf_Linux) && defined(HAVE_GPM)