Mercurial > hg > xemacs-beta
diff src/gpmevent.c @ 153:25f70ba0133c r20-3b3
Import from CVS: tag r20-3b3
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:38:25 +0200 |
parents | |
children | 43dd3413c7c7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gpmevent.c Mon Aug 13 09:38:25 2007 +0200 @@ -0,0 +1,113 @@ +/* William Perry 1997 */ + +#include <config.h> +#include "lisp.h" +#include "console-tty.h" +#include "device.h" +#include "events.h" +#include "events-mod.h" +#include "process.h" +#include "sysdep.h" +#include "sysproc.h" /* select stuff */ +#include "systime.h" + +#ifdef HAVE_GPM +#include "gpmevent.h" +#include <gpm.h> + +#if (!defined(__linux__)) /* possible under xterm */ +#define KG_SHIFT 0 +#define KG_CTRL 2 +#define KG_ALT 3 +#else +#include <linux/keyboard.h> +#endif + +extern SELECT_TYPE input_wait_mask, non_fake_input_wait_mask; +extern SELECT_TYPE process_only_mask, device_only_mask; +void select_filedesc (int fd, Lisp_Object what); + +int handle_gpm_read(struct Lisp_Event *event, struct console *con, int fd) +{ + Gpm_Event ev; + int modifiers,type,button; + + type = -1; + button = 1; + + if (!Gpm_GetEvent(&ev)) + return(0); + + event->timestamp = 0; + event->channel = CONSOLE_SELECTED_FRAME (con); + + /* Whow, wouldn't named defines be NICE!?!?! */ + modifiers = 0; + + if (ev.modifiers & 1) modifiers |= MOD_SHIFT; + if (ev.modifiers & 2) modifiers |= MOD_META; + if (ev.modifiers & 4) modifiers |= MOD_CONTROL; + if (ev.modifiers & 8) modifiers |= MOD_META; + + if (ev.type & GPM_DOWN) + type = GPM_DOWN; + else if (ev.type & GPM_UP) + type = GPM_UP; + else if (ev.type & GPM_MOVE) { + type = GPM_MOVE; + GPM_DRAWPOINTER(&ev); + } + + if (ev.buttons & GPM_B_LEFT) + button = 1; + else if (ev.buttons & GPM_B_MIDDLE) + button = 2; + else if (ev.buttons & GPM_B_RIGHT) + button = 3; + + switch (type) { + case GPM_DOWN: + case GPM_UP: + if (type == GPM_DOWN) + event->event_type = button_press_event; + else event->event_type = button_release_event; + event->event.button.x = ev.x; + event->event.button.y = ev.y; + event->event.button.button = button; + event->event.button.modifiers = modifiers; + break; + case GPM_MOVE: + event->event_type = pointer_motion_event; + event->event.motion.x = ev.x; + event->event.motion.y = ev.y; + event->event.motion.modifiers = modifiers; + default: + return (0); + } + return (1); +} + +int connect_to_gpm(struct console *con) +{ + /* Only do this if we are running after dumping and really interactive */ + if (!noninteractive && initialized) { + /* We really only want to do this on a TTY */ + if (EQ (CONSOLE_TYPE (con), Qtty)) { + Gpm_Connect conn; + + conn.eventMask = GPM_DOWN|GPM_UP|GPM_MOVE; + conn.defaultMask = GPM_MOVE; + conn.minMod = 0; + conn.maxMod = ((1<<KG_SHIFT)|(1<<KG_ALT)|(1<<KG_CTRL)); + + if (Gpm_Open (&conn, 0) == -1) { + CONSOLE_TTY_MOUSE_FD (con) = -1; + return(0); + } + set_descriptor_non_blocking (gpm_fd); + CONSOLE_TTY_MOUSE_FD (con) = gpm_fd; + } + } +} + +#endif