/* Mouse managing Copyright (C) 1994, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2009, 2011 The Free Software Foundation, Inc. Written by: Andrew Borodin , 2009. This file is part of the Midnight Commander. The Midnight Commander 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 3 of the License, or (at your option) any later version. The Midnight Commander 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, see . */ /** \file mouse.c * \brief Source: mouse managing * * Events received by clients of this library have their coordinates 0 based */ #include #include #include #include #include "lib/global.h" #include "tty.h" #include "tty-internal.h" /* mouse_enabled */ #include "mouse.h" #include "key.h" /* define sequence */ /*** global variables ****************************************************************************/ Mouse_Type use_mouse_p = MOUSE_NONE; gboolean mouse_enabled = FALSE; const char *xmouse_seq; /*** file scope macro definitions ****************************************************************/ /*** file scope type declarations ****************************************************************/ /*** file scope variables ************************************************************************/ /*** file scope functions ************************************************************************/ /* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */ /*** public functions ****************************************************************************/ /* --------------------------------------------------------------------------------------------- */ void show_mouse_pointer (int x, int y) { #ifdef HAVE_LIBGPM if (use_mouse_p == MOUSE_GPM) Gpm_DrawPointer (x, y, gpm_consolefd); #else (void) x; (void) y; #endif /* HAVE_LIBGPM */ } /* --------------------------------------------------------------------------------------------- */ void init_mouse (void) { switch (use_mouse_p) { #ifdef HAVE_LIBGPM case MOUSE_NONE: use_mouse_p = MOUSE_GPM; break; #endif /* HAVE_LIBGPM */ case MOUSE_XTERM_NORMAL_TRACKING: case MOUSE_XTERM_BUTTON_EVENT_TRACKING: define_sequence (MCKEY_MOUSE, xmouse_seq, MCKEY_NOACTION); break; default: break; } enable_mouse (); } /* --------------------------------------------------------------------------------------------- */ void enable_mouse (void) { if (mouse_enabled) return; switch (use_mouse_p) { #ifdef HAVE_LIBGPM case MOUSE_GPM: { int mouse_d; Gpm_Connect conn; conn.eventMask = ~GPM_MOVE; conn.defaultMask = GPM_MOVE; conn.minMod = 0; conn.maxMod = 0; mouse_d = Gpm_Open (&conn, 0); if (mouse_d == -1) { use_mouse_p = MOUSE_NONE; return; } mouse_enabled = TRUE; } break; #endif /* HAVE_LIBGPM */ case MOUSE_XTERM_NORMAL_TRACKING: /* save old highlight mouse tracking */ printf (ESC_STR "[?1001s"); /* enable mouse tracking */ printf (ESC_STR "[?1000h"); /* enable urxvt extended mouse coordinate reporting */ printf (ESC_STR "[?1015h"); fflush (stdout); mouse_enabled = TRUE; break; case MOUSE_XTERM_BUTTON_EVENT_TRACKING: /* save old highlight mouse tracking */ printf (ESC_STR "[?1001s"); /* enable mouse tracking */ printf (ESC_STR "[?1002h"); /* enable urxvt extended mouse coordinate reporting */ printf (ESC_STR "[?1015h"); fflush (stdout); mouse_enabled = TRUE; break; default: break; } } /* --------------------------------------------------------------------------------------------- */ void disable_mouse (void) { if (!mouse_enabled) return; mouse_enabled = FALSE; switch (use_mouse_p) { #ifdef HAVE_LIBGPM case MOUSE_GPM: Gpm_Close (); break; #endif case MOUSE_XTERM_NORMAL_TRACKING: /* disable urxvt extended mouse coordinate reporting */ printf (ESC_STR "[?1015l"); /* disable mouse tracking */ printf (ESC_STR "[?1000l"); /* restore old highlight mouse tracking */ printf (ESC_STR "[?1001r"); fflush (stdout); break; case MOUSE_XTERM_BUTTON_EVENT_TRACKING: /* disable urxvt extended mouse coordinate reporting */ printf (ESC_STR "[?1015l"); /* disable mouse tracking */ printf (ESC_STR "[?1002l"); /* restore old highlight mouse tracking */ printf (ESC_STR "[?1001r"); fflush (stdout); break; default: break; } } /* --------------------------------------------------------------------------------------------- */