[gpm] [PATCH 2/18] separate-console-handling.patch
Dmitry Torokhov
dtor_core@ameritech.net
Tue Aug 10 08:50:47 CEST 2004
===================================================================
ChangeSet@1.6, 2004-08-10 00:52:37-05:00, dtor_core@ameritech.net
Move console handling functions to console.c module.
Makefile.in | 4
console.c | 330 +++++++++++++++++++++++++++++++++++++++++++
gpm.c | 408 +++++++++++++-----------------------------------------
gpn.c | 113 +-------------
headers/console.h | 52 ++++++
headers/gpmInt.h | 12 -
headers/message.h | 2
lib/liblow.c | 29 +--
mice.c | 41 ++---
report.c | 57 +++----
special.c | 5
startup.c | 10 -
twiddler.c | 16 --
13 files changed, 574 insertions(+), 505 deletions(-)
===================================================================
diff -Nru a/src/Makefile.in b/src/Makefile.in
--- a/src/Makefile.in 2004-08-10 01:17:57 -05:00
+++ b/src/Makefile.in 2004-08-10 01:17:57 -05:00
@@ -14,7 +14,7 @@
# Main portion: regular build rules
GSRC = main.c gpm.c gpn.c mice.c special.c twiddler.c synaptics.c \
- startup.c server_tools.c
+ startup.c server_tools.c console.c
GOBJ = $(GSRC:.c=.o) report.o tools.o
@@ -153,7 +153,7 @@
$(CC) -I. @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@.o $<
$(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $@.o @LIBS@ $(LIBS) lib/libgpm.a
-prog/mouse-test: mice.o twiddler.o synaptics.o
+prog/mouse-test: mice.o twiddler.o synaptics.o console.o
$(PROG): @SHLIB@ lib/libgpm.a
diff -Nru a/src/console.c b/src/console.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/src/console.c 2004-08-10 01:17:57 -05:00
@@ -0,0 +1,330 @@
+/*
+ * console.c - GPM console and selection/paste handling
+ *
+ * Copyright (C) 1993 Andreq Haylett <ajh@gec-mrc.co.uk>
+ * Copyright (C) 1994-1999 Alessandro Rubini <rubini@linux.it>
+ * Copyright (C) 1998 Ian Zimmerman <itz@rahul.net>
+ * Copyright (c) 2001,2002 Nico Schottelius <nico-gpm@schottelius.org>
+ * Copyright (c) 2003 Dmitry Torokhov <dtor@mail.ru>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h> /* strerror(); ?!? */
+#include <errno.h>
+#include <unistd.h> /* select(); */
+#include <time.h> /* time() */
+#include <sys/fcntl.h> /* O_RDONLY */
+#include <sys/stat.h> /* mkdir() */
+#include <asm/types.h> /* __u32 */
+
+#include <linux/vt.h> /* VT_GETSTATE */
+#include <sys/kd.h> /* KDGETMODE */
+#include <termios.h> /* winsize */
+
+#include "headers/gpmInt.h"
+#include "headers/console.h"
+#include "headers/message.h"
+
+#ifndef HAVE___U32
+# ifndef _I386_TYPES_H /* /usr/include/asm/types.h */
+typedef unsigned int __u32;
+# endif
+#endif
+
+struct sel_options sel_opts = { 0, 0, DEF_PTRDRAG };
+struct gpm_console console = { 0, DEF_LUT, 0, 0 };
+
+static time_t last_selection_time;
+
+/*-------------------------------------------------------------------*/
+int open_console(int mode)
+{
+ int fd;
+
+ if ((fd = open(console.device, mode)) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN_CON);
+
+ return fd;
+}
+
+/*-------------------------------------------------------------------*/
+int is_text_console(void)
+{
+ int fd;
+ int kd_mode;
+
+ fd = open_console(O_RDONLY);
+ if (ioctl(fd, KDGETMODE, &kd_mode) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_IOCTL_KDGETMODE);
+ close(fd);
+
+ return kd_mode == KD_TEXT;
+}
+
+/*-------------------------------------------------------------------*/
+void wait_text_console(void)
+{
+ do {
+ sleep(2);
+ } while (!is_text_console());
+}
+
+/*-------------------------------------------------------------------*/
+void refresh_console_size(void)
+{
+ struct winsize win;
+ int fd = open_console(O_RDONLY);
+
+ ioctl(fd, TIOCGWINSZ, &win);
+ close(fd);
+
+ if (!win.ws_col || !win.ws_row) {
+ gpm_report(GPM_PR_DEBUG, GPM_MESS_ZERO_SCREEN_DIM);
+ console.max_x = 80; console.max_y = 25;
+ } else {
+ console.max_x = win.ws_col; console.max_y = win.ws_row;
+ }
+ gpm_report(GPM_PR_DEBUG, GPM_MESS_SCREEN_SIZE, console.max_x, console.max_y);
+}
+
+/*-------------------------------------------------------------------*/
+int get_console_state(unsigned char *shift_state)
+{
+ struct vt_stat stat;
+ int fd;
+
+ fd = open_console(O_RDONLY);
+
+ *shift_state = 6; /* code for the ioctl */
+ if (ioctl(fd, TIOCLINUX, shift_state) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_GET_SHIFT_STATE);
+
+ if (ioctl(fd, VT_GETSTATE, &stat) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_GET_CONSOLE_STAT);
+
+ close(fd);
+
+ return stat.v_active;
+}
+
+/*-------------------------------------------------------------------*/
+int is_console_owner(int vc, uid_t uid)
+{
+ struct stat statbuf;
+ char *tty;
+ int rc;
+
+ tty = malloc(strlen(console.device) + Gpm_cnt_digits(vc) + sizeof(char));
+ if (!tty)
+ gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM);
+
+ strncpy(tty, console.device, strlen(console.device) - 1);
+ sprintf(&tty[strlen(console.device) - 1], "%d", vc);
+
+ rc = stat(tty, &statbuf);
+
+ free(tty);
+
+ if (rc == -1) {
+ gpm_report(GPM_PR_ERR, GPM_MESS_STAT_FAILS, tty);
+ return 0;
+ }
+
+ return uid == statbuf.st_uid;
+}
+
+/*-------------------------------------------------------------------*/
+/* octal digit */
+static int isodigit(const unsigned char c)
+{
+ return ((c & ~7) == '0');
+}
+
+/*-------------------------------------------------------------------*/
+/* routine to convert digits from octal notation (Andries Brouwer) */
+static int getsym(const unsigned char *p0, unsigned char *res)
+{
+ const unsigned char *p = p0;
+ char c;
+
+ c = *p++;
+ if (c == '\\' && *p) {
+ c = *p++;
+ if (isodigit(c)) {
+ c -= '0';
+ if (isodigit(*p)) c = 8*c + (*p++ - '0');
+ if (isodigit(*p)) c = 8*c + (*p++ - '0');
+ }
+ }
+ *res = c;
+ return (p - p0);
+}
+
+/*-------------------------------------------------------------------*/
+/* description missing! FIXME */
+void console_load_lut(void)
+{
+ extern int errno;
+ int i, c, fd;
+ unsigned char this, next;
+ static __u32 long_array[9] = {
+ 0x05050505, /* ugly, but preserves alignment */
+ 0x00000000, /* control chars */
+ 0x00000000, /* digits */
+ 0x00000000, /* uppercase and '_' */
+ 0x00000000, /* lowercase */
+ 0x00000000, /* Latin-1 control */
+ 0x00000000, /* Latin-1 misc */
+ 0x00000000, /* Latin-1 uppercase */
+ 0x00000000 /* Latin-1 lowercase */
+ };
+
+#define inwordLut (long_array+1)
+
+ for (i = 0; console.charset[i]; ) {
+ i += getsym(console.charset + i, &this);
+ if (console.charset[i] == '-' && console.charset[i + 1] != '\0')
+ i += getsym(console.charset + i + 1, &next) + 1;
+ else
+ next = this;
+ for (c = this; c <= next; c++)
+ inwordLut[c >> 5] |= 1 << (c & 0x1F);
+ }
+
+ fd = open_console(O_WRONLY);
+
+ if (ioctl(fd, TIOCLINUX, &long_array) < 0) { /* fd <0 is checked */
+ if (errno == EPERM && getuid())
+ gpm_report(GPM_PR_WARN, GPM_MESS_ROOT); /* why do we still continue?*/
+ else if (errno == EINVAL)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_CSELECT);
+ }
+ close(fd);
+}
+
+/*-------------------------------------------------------------------*/
+static void selection_copy(int x1, int y1, int x2, int y2, int mode)
+{
+ /*
+ * The approach in "selection" causes a bus error when run under SunOS 4.1
+ * due to alignment problems...
+ */
+ unsigned char buf[6 * sizeof(short)];
+ unsigned short *arg = (unsigned short *)buf + 1;
+ int fd;
+
+ buf[sizeof(short) - 1] = 2; /* set selection */
+
+ arg[0] = (unsigned short)x1;
+ arg[1] = (unsigned short)y1;
+ arg[2] = (unsigned short)x2;
+ arg[3] = (unsigned short)y2;
+ arg[4] = (unsigned short)mode;
+
+ if ((fd = open_console(O_WRONLY)) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN_CON);
+
+ gpm_report(GPM_PR_DEBUG, "ctl %i, mode %i", (int)*buf, arg[4]);
+ if (ioctl(fd, TIOCLINUX, buf + sizeof(short) - 1) < 0)
+ gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_TIOCLINUX);
+ close(fd);
+
+ if (mode < 3) {
+ sel_opts.aged = 0;
+ last_selection_time = time(0);
+ }
+}
+
+/*-------------------------------------------------------------------*/
+static void selection_paste(void)
+{
+ char c = 3;
+ int fd;
+
+ if (!sel_opts.aged &&
+ sel_opts.age_limit != 0 &&
+ last_selection_time + sel_opts.age_limit < time(0)) {
+ sel_opts.aged = 1;
+ }
+
+ if (sel_opts.aged)
+ gpm_report(GPM_PR_DEBUG, GPM_MESS_SKIP_PASTE);
+ else {
+ fd = open_console(O_WRONLY);
+ if (ioctl(fd, TIOCLINUX, &c) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_IOCTL_TIOCLINUX);
+ close(fd);
+ }
+}
+
+/*-------------------------------------------------------------------*/
+void do_selection(Gpm_Event *event, int three_button_mode)
+{
+ static int x1 = 1, y1 = 1;
+ int x2, y2;
+
+ x2 = event->x; y2 = event->y;
+ switch (GPM_BARE_EVENTS(event->type)) {
+ case GPM_MOVE:
+ if (x2 < 1) x2++; else if (x2 > console.max_x) x2--;
+ if (y2 < 1) y2++; else if (y2 > console.max_y) y2--;
+ selection_copy(x2, y2, x2, y2, 3); /* just highlight the pointer */
+ break;
+
+ case GPM_DRAG:
+ if (event->buttons == GPM_B_LEFT) {
+ switch(event->margin) { /* fix margins */
+ case GPM_TOP: x2 = 1; y2++; break;
+ case GPM_BOT: x2 = console.max_x; y2--; break;
+ case GPM_RGT: x2--; break;
+ case GPM_LFT: y2 <= y1 ? x2++ : (x2 = console.max_x, y2--); break;
+ default: break;
+ }
+ selection_copy(x1, y1, x2, y2, event->clicks);
+ if (event->clicks >= sel_opts.ptrdrag && !event->margin) /* pointer */
+ selection_copy(x2, y2, x2, y2, 3);
+ } /* if */
+ break;
+
+ case GPM_DOWN:
+ switch (event->buttons) {
+ case GPM_B_LEFT:
+ x1 = x2; y1 = y2;
+ selection_copy(x1, y1, x2, y2, event->clicks); /* start selection */
+ break;
+
+ case GPM_B_MIDDLE:
+ selection_paste();
+ break;
+
+ case GPM_B_RIGHT:
+ if (three_button_mode == 1)
+ selection_copy(x1, y1, x2, y2, event->clicks);
+ else
+ selection_paste();
+ break;
+ }
+ } /* switch above */
+}
+
+/*-------------------------------------------------------------------*/
+void selection_disable_paste(void)
+{
+ sel_opts.aged = 1;
+}
+
diff -Nru a/src/gpm.c b/src/gpm.c
--- a/src/gpm.c 2004-08-10 01:17:57 -05:00
+++ b/src/gpm.c 2004-08-10 01:17:57 -05:00
@@ -28,7 +28,6 @@
#include <unistd.h> /* select(); */
#include <signal.h> /* SIGPIPE */
#include <time.h> /* time() */
-#include <sys/param.h>
#include <sys/fcntl.h> /* O_RDONLY */
#include <sys/wait.h> /* wait() */
#include <sys/stat.h> /* mkdir() */
@@ -37,12 +36,9 @@
#include <sys/socket.h> /* socket() */
#include <sys/un.h> /* struct sockaddr_un */
-#include <linux/vt.h> /* VT_GETSTATE */
-#include <sys/kd.h> /* KDGETMODE */
-#include <termios.h> /* winsize */
-
#include "headers/gpmInt.h"
#include "headers/message.h"
+#include "headers/console.h"
/* who the f*** runs gpm without glibc? doesn't have dietlibc __socklent_t? */
#if !defined(__GLIBC__)
@@ -78,27 +74,19 @@
/* These are only the 'global' options */
-char *opt_lut=DEF_LUT;
int opt_test=DEF_TEST;
-int opt_ptrdrag=DEF_PTRDRAG;
int opt_double=0;
-int opt_aged = 0;
char *opt_special=NULL; /* special commands, like reboot or such */
int opt_rawrep=0;
Gpm_Type *repeated_type=0;
static int opt_resize=0; /* not really an option */
-struct winsize win;
-int maxx, maxy;
int fifofd=-1;
int eventFlag=0;
Gpm_Cinfo *cinfo[MAX_VC+1];
fd_set selSet, readySet, connSet;
-time_t last_selection_time;
-time_t opt_age_limit = 0;
-
/* BRAINDEAD..ok not really, but got to leave anyway... FIXME */
/* argc and argv for mice initialization */
static int mouse_argc[3]; /* 0 for default (unused) and two mice */
@@ -144,155 +132,6 @@
}
/*-------------------------------------------------------------------*/
-/* The old console option is removed. We are taking stderr now
- * In the next update there should also be support for syslog
- ********************************************************************/
-
-static inline int open_console(const int mode)
-{
- int fd;
-
- if ((fd=open(option.consolename, mode)) < 0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON);
- return fd;
-}
-
-/*-------------------------------------------------------------------*/
-static inline int wait_text(int *fdptr)
-{
- int fd;
- int kd_mode;
-
- close(*fdptr);
- do
- {
- sleep(2);
- fd = open_console(O_RDONLY);
- if (ioctl(fd, KDGETMODE, &kd_mode)<0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_KDGETMODE);
- close(fd);
- }
- while (kd_mode != KD_TEXT) ;
-
- /* reopen, reinit (the function is only used if we have one mouse device) */
- if ((*fdptr=open(opt_dev,O_RDWR))<0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN,opt_dev);
- if (m_type->init)
- m_type=(m_type->init)(*fdptr, m_type->flags, m_type, mouse_argc[1],
- mouse_argv[1]);
- return (1);
-}
-
-/*-------------------------------------------------------------------*/
-static inline void selection_copy(int x1, int y1, int x2, int y2, int mode)
-{
-/*
- * The approach in "selection" causes a bus error when run under SunOS 4.1
- * due to alignment problems...
- */
- unsigned char buf[6*sizeof(short)];
- unsigned short *arg = (unsigned short *)buf + 1;
- int fd;
-
- buf[sizeof(short)-1] = 2; /* set selection */
-
- arg[0]=(unsigned short)x1;
- arg[1]=(unsigned short)y1;
- arg[2]=(unsigned short)x2;
- arg[3]=(unsigned short)y2;
- arg[4]=(unsigned short)mode;
-
- if ((fd=open_console(O_WRONLY))<0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON);
- /* FIXME: should be replaced with string constant (headers/message.h) */
- gpm_report(GPM_PR_DEBUG,"ctl %i, mode %i",(int)*buf, arg[4]);
- if (ioctl(fd, TIOCLINUX, buf+sizeof(short)-1) < 0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_TIOCLINUX);
- close(fd);
-
- if (mode < 3) {
- opt_aged = 0;
- last_selection_time = time(0);
- }
-}
-
-
-/*-------------------------------------------------------------------*/
-/* comment missing; FIXME */
-/*-------------------------------------------------------------------*/
-static inline void selection_paste(void)
-{
- char c=3;
- int fd;
-
- if (!opt_aged && (0 != opt_age_limit) &&
- (last_selection_time + opt_age_limit < time(0))) {
- opt_aged = 1;
- }
-
- if (opt_aged) {
- gpm_report(GPM_PR_DEBUG,GPM_MESS_SKIP_PASTE);
- return;
- }
-
- fd=open_console(O_WRONLY);
- if(ioctl(fd, TIOCLINUX, &c) < 0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_TIOCLINUX);
- close(fd);
-}
-
-/*-------------------------------------------------------------------*/
-static inline int do_selection(Gpm_Event *event) /* returns 0, always */
-{
- static int x1=1, y1=1, x2, y2;
-#define UNPOINTER() 0
-
- x2=event->x; y2=event->y;
- switch(GPM_BARE_EVENTS(event->type)) {
- case GPM_MOVE:
- if (x2<1) x2++; else if (x2>maxx) x2--;
- if (y2<1) y2++; else if (y2>maxy) y2--;
- selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */
- return 0;
-
- case GPM_DRAG:
- if (event->buttons==GPM_B_LEFT) {
- if (event->margin) /* fix margins */
- switch(event->margin) {
- case GPM_TOP: x2=1; y2++; break;
- case GPM_BOT: x2=maxx; y2--; break;
- case GPM_RGT: x2--; break;
- case GPM_LFT: y2<=y1 ? x2++ : (x2=maxx, y2--); break;
- }
- selection_copy(x1,y1,x2,y2,event->clicks);
- if (event->clicks>=opt_ptrdrag && !event->margin) /* pointer */
- selection_copy(x2,y2,x2,y2,3);
- } /* if */
- return 0;
-
- case GPM_DOWN:
- switch (event->buttons) {
- case GPM_B_LEFT:
- x1=x2; y1=y2;
- selection_copy(x1,y1,x2,y2,event->clicks); /* start selection */
- return 0;
-
- case GPM_B_MIDDLE:
- selection_paste();
- return 0;
-
- case GPM_B_RIGHT:
- if (opt_three==1)
- selection_copy(x1,y1,x2,y2,event->clicks);
- else
- selection_paste();
- return 0;
- }
- } /* switch above */
- return 0;
-}
-
-/*-------------------------------------------------------------------*/
/* returns 0 if the event has not been processed, and 1 if it has */
static inline int do_client(Gpm_Cinfo *cinfo, Gpm_Event *event)
{
@@ -329,7 +168,7 @@
* fetch the actual device data from the mouse device, dependent on
* what Gpm_Type is being passed.
*-------------------------------------------------------------------*/
-static inline char *getMouseData(int fd, Gpm_Type *type, int kd_mode)
+static inline char *getMouseData(int fd, Gpm_Type *type, int text_mode)
{
static unsigned char data[32]; /* quite a big margin :) */
char *edata=data+type->packetlen;
@@ -344,7 +183,7 @@
return NULL;
}
- if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep)
+ if (!text_mode && fifofd != -1 && opt_rawrep)
write(fifofd, data, howmany);
if ((data[0]&(m_type->proto)[0]) != (m_type->proto)[1]) {
@@ -367,7 +206,7 @@
if((i=m_type->packetlen-howmany)) /* still to get */
do {
j = read(fd,edata-i,i); /* edata is pointer just after data */
- if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep && j > 0)
+ if (!text_mode && fifofd != -1 && opt_rawrep && j > 0)
write(fifofd, edata-i, j);
i -= j;
} while (i && j);
@@ -388,21 +227,48 @@
static int statusX,statusY,statusB; /* to return info */
static int statusC=0; /* clicks */
-void get_console_size(Gpm_Event *ePtr);
+
+/*-------------------------------------------------------------------*/
+void handle_console_resize(Gpm_Event *ePtr)
+{
+ int old_x, old_y;
+ int i;
+ struct mouse_features *which_mouse; /* local */
+
+ old_x = console.max_x; old_y = console.max_y;
+ refresh_console_size();
+ if (!old_x) { /* first invocation, place the pointer in the middle */
+ statusX = ePtr->x = console.max_x / 2;
+ statusY = ePtr->y = console.max_y / 2;
+ } else { /* keep the pointer in the same position where it was */
+ statusX = ePtr->x = ePtr->x * console.max_x / old_x;
+ statusY = ePtr->y = ePtr->y * console.max_y / old_y;
+ }
+
+ for (i=1; i <= 1+opt_double; i++) {
+ which_mouse=mouse_table+i; /* used to access options */
+ /*
+ * the following operation is based on the observation that 80x50
+ * has square cells. (An author-centric observation ;-)
+ */
+ opt_scaley = opt_scale * 50 * console.max_x / 80 / console.max_y;
+ gpm_report(GPM_PR_DEBUG, GPM_MESS_X_Y_VAL, opt_scale, opt_scaley);
+ }
+}
/*-------------------------------------------------------------------
* call getMouseData to get hardware device data, call mouse device's fun()
* to retrieve the hardware independent event data, then optionally repeat
* the data via repeat_fun() to the repeater device
*-------------------------------------------------------------------*/
-static inline int processMouse(int fd, Gpm_Event *event, Gpm_Type *type,
- int kd_mode)
+static inline int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int text_mode)
{
char *data;
+ unsigned char shift_state;
+ static int last_active;
static int fine_dx, fine_dy;
- static int i, j, m;
+ static int i, m;
static Gpm_Event nEvent;
- static struct vt_stat stat;
static struct timeval tv1={0,0}, tv2; /* tv1==0: first click is single */
static struct timeval timeout={0,0};
fd_set fdSet;
@@ -433,7 +299,7 @@
FD_ZERO(&fdSet); FD_SET(fd,&fdSet); i=0;
do { /* cluster loop */
- if(((data=getMouseData(fd,m_type,kd_mode))==NULL)
+ if(((data=getMouseData(fd,m_type, text_mode))==NULL)
|| ((*(m_type->fun))(&nEvent,data)==-1) ) {
if (!i) return 0;
else break;
@@ -482,7 +348,7 @@
/*....................................... we're a repeater, aren't we? */
- if (kd_mode!=KD_TEXT) {
+ if (!text_mode) {
if (fifofd != -1 && ! opt_rawrep) {
if (m_type->absolute) { /* hof Wed Feb 3 21:43:28 MET 1999 */
/* prepare the values from a absolute device for repeater mode */
@@ -495,7 +361,7 @@
}
rept1=rept2;
- event->dy=event->dy*((win.ws_col/win.ws_row)+1);
+ event->dy = event->dy * ((console.max_x / console.max_y) + 1);
event->x=nEvent.x;
event->y=nEvent.y;
}
@@ -530,32 +396,17 @@
/*....................................... fill missing fields */
- event->x+=event->dx, event->y+=event->dy;
+ event->x += event->dx, event->y += event->dy;
statusB=event->buttons;
- i=open_console(O_RDONLY);
- /* modifiers */
- j = event->modifiers; /* save them */
- event->modifiers=6; /* code for the ioctl */
- if (ioctl(i,TIOCLINUX,&(event->modifiers))<0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_GET_SHIFT_STATE);
- event->modifiers |= j; /* add mouse-specific bits */
-
- /* status */
- j = stat.v_active;
- if (ioctl(i,VT_GETSTATE,&stat)<0) gpm_report(GPM_PR_OOPS,GPM_MESS_GET_CONSOLE_STAT);
-
- /*
- * if we changed console, request the current console size,
- * as different consoles can be of different size
- */
- if (stat.v_active != j)
- get_console_size(event);
- close(i);
-
- event->vc = stat.v_active;
+ event->vc = get_console_state(&shift_state);
+ if (event->vc != last_active) {
+ handle_console_resize(event);
+ last_active = event->vc;
+ }
+ event->modifiers |= shift_state;
- if (oldB==event->buttons)
+ if (oldB == event->buttons)
event->type = (event->buttons ? GPM_DRAG : GPM_MOVE);
else
event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP);
@@ -604,15 +455,27 @@
*/
m = 0;
- i = ((event->type&(GPM_DRAG|GPM_UP))!=0); /* i is boolean */
-
- if (event->y>win.ws_row) {event->y=win.ws_row+1-!i; i=0; m = GPM_BOT;}
- else if (event->y<=0) {event->y=1-i; i=0; m = GPM_TOP;}
+ i = (event->type & (GPM_DRAG|GPM_UP)) != 0; /* i is boolean */
- if (event->x>win.ws_col) {event->x=win.ws_col+1-!i; if (!m) m = GPM_RGT;}
- else if (event->x<=0) {event->x=1-i; if (!m) m = GPM_LFT;}
+ if (event->y > console.max_y) {
+ event->y = console.max_y + 1 - !i;
+ i = 0;
+ m = GPM_BOT;
+ } else if (event->y <= 0) {
+ event->y = 1 - i;
+ i = 0;
+ m = GPM_TOP;
+ }
+
+ if (event->x > console.max_x) {
+ event->x = console.max_x + 1 - !i;
+ if (!m) m = GPM_RGT;
+ } else if (event->x <= 0) {
+ event->x = 1 - i;
+ if (!m) m = GPM_LFT;
+ }
- event->margin=m;
+ event->margin = m;
gpm_report(GPM_PR_DEBUG,"M: %3i %3i (%3i %3i) - butt=%i vc=%i cl=%i",
event->dx,event->dy,
@@ -654,12 +517,6 @@
return 1;
}
-static void disable_paste(int vc)
-{
- opt_aged++;
- gpm_report(GPM_PR_INFO,GPM_MESS_DISABLE_PASTE,vc);
-}
-
/*-------------------------------------------------------------------*/
/* returns -1 if closing connection */
static inline int processRequest(Gpm_Cinfo *ci, int vc)
@@ -668,7 +525,6 @@
Gpm_Cinfo *cinfoPtr, *next;
Gpm_Connect conn;
static Gpm_Event event;
- static struct vt_stat stat;
gpm_report(GPM_PR_INFO,GPM_MESS_CON_REQUEST, ci->fd, vc);
if (vc>MAX_VC) return -1;
@@ -713,15 +569,9 @@
/* Aha, request for information (so-called snapshot) */
switch(conn.vc) {
case GPM_REQ_SNAPSHOT:
- i=open_console(O_RDONLY);
- ioctl(i,VT_GETSTATE,&stat);
- event.modifiers=6; /* code for the ioctl */
- if (ioctl(i,TIOCLINUX,&(event.modifiers))<0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_GET_SHIFT_STATE);
- close(i);
- event.vc = stat.v_active;
+ event.vc = get_console_state(&event.modifiers);
event.x=statusX; event.y=statusY;
- event.dx=maxx; event.dy=maxy;
+ event.dx = console.max_x; event.dy = console.max_y;
event.buttons= statusB;
event.clicks=statusC;
/* fall through */
@@ -733,7 +583,8 @@
break;
case GPM_REQ_NOPASTE:
- disable_paste(vc);
+ selection_disable_paste();
+ gpm_report(GPM_PR_INFO, GPM_MESS_DISABLE_PASTE, vc);
break;
}
@@ -745,7 +596,6 @@
{
Gpm_Cinfo *info;
Gpm_Connect *request;
- Gpm_Cinfo *next;
int vc, newfd;
#if !defined(__GLIBC__)
int len;
@@ -753,9 +603,11 @@
size_t len; /* isn't that generally defined in C ??? -- nico */
#endif /* __GLIBC__ */
struct sockaddr_un addr; /* reuse this each time */
+#ifndef SO_PEERCRED
struct stat statbuf;
+ time_t staletime;
+#endif
uid_t uid;
- char *tty = NULL;
/*....................................... Accept */
@@ -823,33 +675,15 @@
gpm_report(GPM_PR_DEBUG,GPM_MESS_PEER_SCK_UID, uid);
}
#endif
- if (uid != 0) {
- if(( tty =
- malloc(strlen(option.consolename)+Gpm_cnt_digits(vc) + sizeof(char))) == NULL)
- gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM);
-
- strncpy(tty,option.consolename,strlen(option.consolename)-1);
- sprintf(&tty[strlen(option.consolename)-1],"%d",vc);
-
- if(stat(tty, &statbuf) == -1) {
- gpm_report(GPM_PR_ERR,GPM_MESS_STAT_FAILS,tty);
- free(info);
- free(tty);
- close(newfd);
- return -1;
- }
- if (uid != statbuf.st_uid) {
- gpm_report(GPM_PR_WARN,GPM_MESS_FAILED_CONNECT, uid, tty); /*SUSPECT!*/
- free(info);
- free(tty);
- close(newfd);
- return -1;
- }
- free(tty); /* at least here it's not needed anymore */
+ if (uid != 0 && !is_console_owner(vc, uid)) {
+ gpm_report(GPM_PR_WARN, GPM_MESS_FAILED_CONNECT, uid, vc); /*SUSPECT!*/
+ free(info);
+ close(newfd);
+ return -1;
}
/* register the connection information in the right place */
- info->next=next=cinfo[vc];
+ info->next=cinfo[vc];
info->fd=newfd;
cinfo[vc]=info;
gpm_report(GPM_PR_DEBUG,GPM_MESS_LONG_STATUS,
@@ -866,44 +700,6 @@
}
/*-------------------------------------------------------------------*/
-void get_console_size(Gpm_Event *ePtr)
-{
- int i, prevmaxx, prevmaxy;
- struct mouse_features *which_mouse; /* local */
-
- /* before asking the new console size, save the previous values */
- prevmaxx = maxx; prevmaxy = maxy;
-
- i=open_console(O_RDONLY);
- ioctl(i, TIOCGWINSZ, &win);
- close(i);
- if (!win.ws_col || !win.ws_row) {
- gpm_report(GPM_PR_DEBUG,GPM_MESS_ZERO_SCREEN_DIM);
- win.ws_col=80; win.ws_row=25;
- }
- maxx=win.ws_col; maxy=win.ws_row;
- gpm_report(GPM_PR_DEBUG,GPM_MESS_SCREEN_SIZE,maxx,maxy);
-
- if (!prevmaxx) { /* first invocation, place the pointer in the middle */
- statusX = ePtr->x = maxx/2;
- statusY = ePtr->y = maxy/2;
- } else { /* keep the pointer in the same position where it was */
- statusX = ePtr->x = ePtr->x * maxx / prevmaxx;
- statusY = ePtr->y = ePtr->y * maxy / prevmaxy;
- }
-
- for (i=1; i <= 1+opt_double; i++) {
- which_mouse=mouse_table+i; /* used to access options */
- /*
- * the following operation is based on the observation that 80x50
- * has square cells. (An author-centric observation ;-)
- */
- opt_scaley=opt_scale*50*maxx/80/maxy;
- gpm_report(GPM_PR_DEBUG,GPM_MESS_X_Y_VAL,opt_scale,opt_scaley);
- }
-}
-
-/*-------------------------------------------------------------------*/
static void gpm_killed(int signo)
{
if(signo==SIGWINCH) {
@@ -921,7 +717,7 @@
{
int ctlfd, newfd;
struct sockaddr_un ctladdr;
- int i, len, kd_mode, fd;
+ int i, len, text_mode, fd;
struct timeval timeout;
int maxfd=-1;
int pending;
@@ -977,7 +773,7 @@
/* needs to be 0777, so all users can _try_ to access gpm */
chmod(GPM_NODE_CTL,0777);
- get_console_size(&event); /* get screen dimensions */
+ handle_console_resize(&event); /* get screen dimensions */
/*....................................... wait for mouse and connections */
@@ -1015,7 +811,7 @@
} /* go on */
if(opt_resize) { /* did the console resize? */
- get_console_size(&event);
+ handle_console_resize(&event);
opt_resize--;
signal(SIGWINCH,gpm_killed); /* reinstall handler */
@@ -1042,19 +838,21 @@
* Be sure to be in text mode. This used to be before select,
* but actually it only matters if you have events.
*/
- {
- int fd = open_console(O_RDONLY);
- if (ioctl(fd, KDGETMODE, &kd_mode) < 0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_KDGETMODE);
- close(fd);
- if(kd_mode != KD_TEXT && !option.repeater) {
- wait_text(&mouse_table[1].fd);
- maxfd=max(maxfd,mouse_table[1].fd);
- readySet=connSet;
- FD_SET(mouse_table[1].fd,&readySet);
+ text_mode = is_text_console();
+ if (!text_mode && !option.repeater) {
+ close(mouse_table[i].fd);
+ wait_text_console();
+ /* reopen, reinit (the function is only used if we have one mouse device) */
+ if ((mouse_table[i].fd = open(opt_dev, O_RDWR)) < 0)
+ gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN,opt_dev);
+ if (m_type->init)
+ m_type->init(mouse_table[i].fd, m_type->flags, m_type,
+ mouse_argc[1], mouse_argv[1]);
+ maxfd = max(maxfd, mouse_table[1].fd);
+ readySet = connSet;
+ FD_SET(mouse_table[1].fd, &readySet);
continue; /* reselect */
}
- }
/*....................................... got mouse, process event */
/*
@@ -1066,16 +864,16 @@
which_mouse=mouse_table+i; /* used to access options */
if (FD_ISSET(which_mouse->fd,&selSet)) {
FD_CLR(which_mouse->fd,&selSet); pending--;
- if (processMouse(which_mouse->fd, &event, m_type, kd_mode))
- /* pass it to the client, if any
- * or to the default handler, if any
+ if (processMouse(which_mouse->fd, &event, m_type, text_mode)) {
+ /* pass it to the client or to the default handler,
* or to the selection handler
- */ /* FIXME -- check event.vc */
- /* can't we please rewrite the following a bit nicer?*/
- (cinfo[event.vc] && do_client(cinfo[event.vc], &event))
- || (cinfo[0] && do_client(cinfo[0], &event))
- || do_selection(&event);
+ */
+ if (event.vc > MAX_VC) event.vc = 0;
+ if (event.vc == 0 || !cinfo[event.vc] || !do_client(cinfo[event.vc], &event))
+ if (!cinfo[0] || !do_client(cinfo[0], &event))
+ do_selection(&event, opt_three);
}
+ }
}
/*..................... got connection, process it */
diff -Nru a/src/gpn.c b/src/gpn.c
--- a/src/gpn.c 2004-08-10 01:17:57 -05:00
+++ b/src/gpn.c 2004-08-10 01:17:57 -05:00
@@ -30,119 +30,22 @@
#include <ctype.h> /* isdigit */
#include <signal.h>
#include <stdarg.h> /* Log uses it */
-#include <errno.h>
#include <unistd.h> /* getopt(),symlink() */
-#include <sys/stat.h> /* mkdir() */
-#include <sys/param.h>
-#include <sys/time.h> /* timeval */
-#include <sys/wait.h> /* wait() */
-#include <sys/types.h> /* socket() */
-#include <sys/socket.h> /* socket() */
-#include <sys/un.h> /* struct sockaddr_un */
-#include <asm/types.h> /* __u32 */
-
-#ifdef SIGTSTP /* true if BSD system */
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#endif
-
-#ifndef HAVE___U32
-# ifndef _I386_TYPES_H /* /usr/include/asm/types.h */
-typedef unsigned int __u32;
-# endif
-#endif
#include "headers/message.h"
#include "headers/gpmInt.h"
#include "headers/gpm.h"
-
-extern int errno;
-
-/*===================================================================*/
-/* octal digit */
-static int isodigit(const unsigned char c)
-{
- return ((c & ~7) == '0');
-}
-
-/* routine to convert digits from octal notation (Andries Brouwer) */
-static int getsym(const unsigned char *p0, unsigned char *res)
-{
- const unsigned char *p = p0;
- char c;
-
- c = *p++;
- if (c == '\\' && *p) {
- c = *p++;
- if (isodigit(c)) {
- c -= '0';
- if (isodigit(*p)) c = 8*c + (*p++ - '0');
- if (isodigit(*p)) c = 8*c + (*p++ - '0');
- }
- }
- *res = c;
- return (p - p0);
-}
-
-/* description missing! FIXME */
-int loadlut(char *charset)
-{
- int i, c, fd;
- unsigned char this, next;
- static __u32 long_array[9]={
- 0x05050505, /* ugly, but preserves alignment */
- 0x00000000, /* control chars */
- 0x00000000, /* digits */
- 0x00000000, /* uppercase and '_' */
- 0x00000000, /* lowercase */
- 0x00000000, /* Latin-1 control */
- 0x00000000, /* Latin-1 misc */
- 0x00000000, /* Latin-1 uppercase */
- 0x00000000 /* Latin-1 lowercase */
- };
-
-
-#define inwordLut (long_array+1)
-
- for (i=0; charset[i]; ) {
- i += getsym(charset+i, &this);
- if (charset[i] == '-' && charset[i + 1] != '\0')
- i += getsym(charset+i+1, &next) + 1;
- else
- next = this;
- for (c = this; c <= next; c++)
- inwordLut[c>>5] |= 1 << (c&0x1F);
- }
-
- if ((fd=open(option.consolename, O_WRONLY)) < 0) {
- /* try /dev/console, if /dev/tty0 failed -- is that really senseful ??? */
- free(option.consolename); /* allocated by main */
- if((option.consolename=malloc(strlen(GPM_SYS_CONSOLE)+1)) == NULL)
- gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM);
- strcpy(option.consolename,GPM_SYS_CONSOLE);
-
- if ((fd=open(option.consolename, O_WRONLY)) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON);
- }
- if (ioctl(fd, TIOCLINUX, &long_array) < 0) { /* fd <0 is checked */
- if (errno==EPERM && getuid())
- gpm_report(GPM_PR_WARN,GPM_MESS_ROOT); /* why do we still continue?*/
- else if (errno==EINVAL)
- gpm_report(GPM_PR_OOPS,GPM_MESS_CSELECT);
- }
- close(fd);
-
- return 0;
-}
+#include "headers/console.h"
/* usage: display for usage informations */
int usage(char *whofailed)
{
if (whofailed) {
- gpm_report(GPM_PR_ERR,GPM_MESS_SPEC_ERR,whofailed,option.progname);
+ gpm_report(GPM_PR_ERR, GPM_MESS_SPEC_ERR, whofailed, option.progname);
return 1;
}
- printf(GPM_MESS_USAGE,option.progname, DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE,
- DEF_DELTA, DEF_TIME, DEF_LUT,DEF_SCALE, DEF_SAMPLE, DEF_TYPE);
+ printf(GPM_MESS_USAGE, option.progname, DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE,
+ DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE);
return 1;
}
@@ -242,9 +145,9 @@
while ((opt = getopt(argc, argv, options)) != -1) {
switch (opt) {
case 'a': opt_accel = atoi(optarg); break;
- case 'A': opt_aged++;
+ case 'A': sel_opts.aged = 1;
if (optarg)
- opt_age_limit = atoi(optarg); break;
+ sel_opts.age_limit = atoi(optarg); break;
case 'b': opt_baud = atoi(optarg); break;
case 'B': opt_sequence = optarg; break;
case 'd': opt_delta = atoi(optarg); break;
@@ -253,7 +156,7 @@
case 'h': exit(usage(NULL));
case 'i': opt_time=atoi(optarg); break;
case 'k': check_kill(); break;
- case 'l': opt_lut = optarg; break;
+ case 'l': console.charset = optarg; break;
case 'm': add_mouse(GPM_ADD_DEVICE,optarg);
opt_dev = optarg; break; /* GO AWAY!*/
case 'M': opt_double++; option.repeater++;
@@ -263,7 +166,7 @@
case 'o': add_mouse(GPM_ADD_OPTIONS,optarg);
gpm_report(GPM_PR_DEBUG,"options: %s",optarg);
opt_options = optarg; break; /* GO AWAY */
- case 'p': opt_ptrdrag = 0; break;
+ case 'p': sel_opts.ptrdrag = 0; break;
case 'r':
/* being called responsiveness, I must take the inverse */
opt_scale=atoi(optarg);
diff -Nru a/src/headers/console.h b/src/headers/console.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/src/headers/console.h 2004-08-10 01:17:57 -05:00
@@ -0,0 +1,52 @@
+/*
+ * console.h - GPM console and selection/paste handling
+ *
+ * Copyright (C) 2003 Dmitry Torokhov <dtor@mail.ru>
+ *
+ * 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.
+ ********/
+
+#ifndef __GPM_CONSOLE_H_
+#define __GPM_CONSOLE_H_
+
+struct gpm_console {
+ char *device;
+ char *charset;
+ int max_x, max_y;
+};
+
+struct sel_options {
+ int aged;
+ int age_limit;
+ int ptrdrag;
+};
+
+struct Gpm_Event;
+
+extern struct sel_options sel_opts; /* only one exists */
+extern struct gpm_console console; /* same */
+
+int open_console(int mode);
+int is_text_console(void);
+void wait_text_console(void);
+void refresh_console_size(void);
+int is_console_owner(int vc, uid_t uid);
+int get_console_state(unsigned char *shift_state);
+void console_load_lut(void);
+
+void do_selection(struct Gpm_Event *event, int three_button_mode);
+void selection_disable_paste(void);
+
+#endif /* __GPM_CONSOLE_H_ */
diff -Nru a/src/headers/gpmInt.h b/src/headers/gpmInt.h
--- a/src/headers/gpmInt.h 2004-08-10 01:17:57 -05:00
+++ b/src/headers/gpmInt.h 2004-08-10 01:17:57 -05:00
@@ -164,9 +164,6 @@
extern struct mouse_features mouse_table[3], *which_mouse; /*the current one*/
-// looks unused; delete
-//typedef struct Opt_struct_type {int a,B,d,i,p,r,V,A;} Opt_struct_type;
-
/* this is not very clean, actually, but it works fine */
#define opt_type (which_mouse->opt_type)
#define opt_dev (which_mouse->opt_dev)
@@ -187,12 +184,9 @@
/* the other variables */
-extern char *opt_lut;
-extern int opt_test, opt_ptrdrag;
+extern int opt_test;
extern int opt_kill;
extern int opt_kernel, opt_explicittype;
-extern int opt_aged;
-extern time_t opt_age_limit;
extern char *opt_special;
extern int opt_rawrep;
extern int fifofd;
@@ -200,8 +194,6 @@
extern Gpm_Type *repeated_type;
extern Gpm_Type mice[]; /* where the hell are the descriptions...*/
-extern struct winsize win;
-extern int maxx, maxy;
extern Gpm_Cinfo *cinfo[MAX_VC+1];
/* new variables <CLEAN> */
@@ -224,14 +216,12 @@
int run_status; /* startup/daemon/debug */
char *progname; /* hopefully gpm ;) */
struct micetab *micelist; /* mice and their options */
- char *consolename; /* /dev/tty0 || /dev/vc/0 */
};
/* global variables */
struct options option; /* one should be enough for us */
/* new variables </CLEAN> */
-
/*....................................... Prototypes */
/* server_tools.c */
diff -Nru a/src/headers/message.h b/src/headers/message.h
--- a/src/headers/message.h 2004-08-10 01:17:57 -05:00
+++ b/src/headers/message.h 2004-08-10 01:17:57 -05:00
@@ -196,7 +196,7 @@
/* warnings */
#define GPM_MESS_REQUEST_ON "Request on vc %i > %i"
-#define GPM_MESS_FAILED_CONNECT "Failed gpm connect attempt by uid %d for vc %s"
+#define GPM_MESS_FAILED_CONNECT "Failed gpm connect attempt by uid %d for vc %d"
#define GPM_MESS_ZERO_SCREEN_DIM "zero screen dimension, assuming 80x25"
#define GPM_MESS_STRANGE_DATA "Data on strange file descriptor %d"
#define GPM_MESS_RESIZING "%s pid %i is resizing :-)"
diff -Nru a/src/lib/liblow.c b/src/lib/liblow.c
--- a/src/lib/liblow.c 2004-08-10 01:17:57 -05:00
+++ b/src/lib/liblow.c 2004-08-10 01:17:57 -05:00
@@ -80,6 +80,8 @@
int gpm_consolefd=-1; /* used to invoke ioctl() */
int gpm_morekeys=0;
+static char *consolename;
+
int gpm_convert_event(unsigned char *mdata, Gpm_Event *ePtr);
/*----------------------------------------------------------------------------*
@@ -192,7 +194,6 @@
char *tty = NULL;
char *term = NULL;
int i;
- extern struct options option;
static int checked_con = 0;
struct sockaddr_un addr;
struct winsize win;
@@ -214,7 +215,7 @@
/* check whether we know what name the console is: what's with the lib??? */
if(checked_con == 0) {
- option.consolename = Gpm_get_console();
+ consolename = Gpm_get_console();
checked_con++;
}
@@ -240,17 +241,17 @@
if (new->next)
conn->vc=new->next->info.vc; /* inherit */
else {
- if (!option.consolename) {
- gpm_report(GPM_PR_ERR,"option.consolename null");
+ if (consolename) {
+ gpm_report(GPM_PR_ERR, "consolename is null");
goto err;
- }
+ }
conn->vc=0; /* default handler */
if (flag > 0) { /* forced vc number */
conn->vc=flag;
- if((tty = malloc(strlen(option.consolename)+Gpm_cnt_digits(flag))) == NULL)
+ if((tty = malloc(strlen(consolename)+Gpm_cnt_digits(flag))) == NULL)
gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM);
- memcpy(tty,option.consolename,strlen(option.consolename)-1);
- sprintf(&tty[strlen(option.consolename)-1],"%i",flag);
+ memcpy(tty,consolename,strlen(consolename)-1);
+ sprintf(&tty[strlen(consolename)-1],"%i",flag);
} else { /* use your current vc */
if (isatty(0)) tty = ttyname(0); /* stdin */
if (!tty && isatty(1)) tty = ttyname(1); /* stdout */
@@ -260,13 +261,13 @@
goto err;
}
/* do we really need this check ? */
- if(strncmp(tty,option.consolename,strlen(option.consolename)-1)
- || !isdigit(tty[strlen(option.consolename)-1])) {
- gpm_report(GPM_PR_ERR,"strncmp/isdigit/option.consolename failed");
+ if(strncmp(tty,consolename,strlen(consolename)-1)
+ || !isdigit(tty[strlen(consolename)-1])) {
+ gpm_report(GPM_PR_ERR,"strncmp/isdigit/consolename failed");
goto err;
}
- conn->vc=atoi(&tty[strlen(option.consolename)-1]);
+ conn->vc=atoi(&tty[strlen(consolename)-1]);
}
if (gpm_consolefd == -1)
@@ -372,11 +373,11 @@
/*....................................... Error: free all memory */
err:
gpm_report(GPM_PR_ERR,"Oh, oh, it's an error! possibly I die! ");
- while(gpm_stack) {
+ while (gpm_stack) {
new=gpm_stack->next;
free(gpm_stack);
gpm_stack=new;
- };
+ }
if (gpm_fd>=0) close(gpm_fd);
if (sock_name) {
unlink(sock_name);
diff -Nru a/src/mice.c b/src/mice.c
--- a/src/mice.c 2004-08-10 01:17:57 -05:00
+++ b/src/mice.c 2004-08-10 01:17:57 -05:00
@@ -72,6 +72,7 @@
#include "headers/gpmInt.h"
+#include "headers/console.h"
#include "headers/twiddler.h"
#include "headers/synaptics.h"
#include "headers/message.h"
@@ -336,12 +337,12 @@
x = ((data[2]<<7) | data[1])-SUMMA_BORDER;
if (x<0) x=0;
if (x>summamaxx) x=summamaxx;
- state->x = (x * win.ws_col / summamaxx);
+ state->x = (x * console.max_x / summamaxx);
realposx = (x * 16383 / summamaxx);
y = ((data[4]<<7) | data[3])-SUMMA_BORDER;
if (y<0) y=0; if (y>summamaxy) y=summamaxy;
- state->y = 1 + y * (win.ws_row-1)/summamaxy;
+ state->y = 1 + y * (console.max_y-1)/summamaxy;
realposy = y * 16383 / summamaxy;
state->buttons=
@@ -880,8 +881,8 @@
if (WacomAbsoluteWanted) { /* Absolute Mode */
if (x>wmaxx) x=wmaxx; if (x<0) x=0;
if (y>wmaxy) y=wmaxy; if (y<0) y=0;
- state->x = (x * win.ws_col / wmaxx);
- state->y = (y * win.ws_row / wmaxy);
+ state->x = (x * console.max_x / wmaxx);
+ state->y = (y * console.max_y / wmaxy);
realposx = (x / wmaxx); /* this two lines come from the summa driver. */
realposy = (y / wmaxy); /* they seem to be buggy (always give zero). */
@@ -891,8 +892,8 @@
if( abs(x-ox)>(wmaxx/wcmodell[WacomModell].treshold)
|| abs(y-oy)>(wmaxy/wcmodell[WacomModell].treshold) ) ox=x; oy=y;
- state->dx= (x-ox) / (wmaxx / win.ws_col / wcmodell[WacomModell].treshold);
- state->dy= (y-oy) / (wmaxy / win.ws_row / wcmodell[WacomModell].treshold);
+ state->dx= (x-ox) / (wmaxx / console.max_x / wcmodell[WacomModell].treshold);
+ state->dy= (y-oy) / (wmaxy / console.max_y / wcmodell[WacomModell].treshold);
}
ox=x; oy=y;
@@ -934,12 +935,12 @@
state->dx = 0; state->dy = 0;
state->x = x < CAL_X_MIN ? 0
- : x > CAL_X_MAX ? win.ws_col+1
- : (long)(x-CAL_X_MIN) * (long)(win.ws_col-1) / CAL_X_SIZE+2;
+ : x > CAL_X_MAX ? console.max_x+1
+ : (long)(x-CAL_X_MIN) * (long)(console.max_x-1) / CAL_X_SIZE+2;
- state->y = y < CAL_Y_MIN ? win.ws_row + 1
+ state->y = y < CAL_Y_MIN ? console.max_y + 1
: y > CAL_Y_MAX ? 0
- : (long)(CAL_Y_MAX-y) * (long)win.ws_row / CAL_Y_SIZE + 1;
+ : (long)(CAL_Y_MAX-y) * (long)console.max_y / CAL_Y_SIZE + 1;
realposx = x < CAL_X_MIN ? 0
: x > CAL_X_MAX ? 16384
@@ -1004,14 +1005,14 @@
state->x = x < NCR_LEFT_X
? 0
: x > NCR_RIGHT_X
- ? win.ws_col+1
- : (long)(x-NCR_LEFT_X) * (long)(win.ws_col-1) / NCR_DELTA_X+2;
+ ? console.max_x+1
+ : (long)(x-NCR_LEFT_X) * (long)(console.max_x-1) / NCR_DELTA_X+2;
state->y = y < NCR_BOTTOM_Y
- ? win.ws_row + 1
+ ? console.max_y + 1
: y > NCR_TOP_Y
? 0
- : (long)(NCR_TOP_Y-y) * (long)win.ws_row / NCR_DELTA_Y + 1;
+ : (long)(NCR_TOP_Y-y) * (long)console.max_y / NCR_DELTA_Y + 1;
realposx = x < NCR_LEFT_X
? 0
@@ -1221,8 +1222,8 @@
static int upx, upy; /* keep track of last finger-up place */
static struct timeval uptv, tv; /* time of last up, and down events */
- #define REAL_TO_XCELL(x) (x * win.ws_col / 0x3FFF)
- #define REAL_TO_YCELL(y) (y * win.ws_row / 0x3FFF)
+ #define REAL_TO_XCELL(x) (x * console.max_x / 0x3FFF)
+ #define REAL_TO_YCELL(y) (y * console.max_y / 0x3FFF)
#define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL))
#define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \
@@ -1302,8 +1303,8 @@
static struct timeval uptv, tv; /* time of last up, and down events */
int timediff;
- #define REAL_TO_XCELL(x) (x * win.ws_col / 0x3FFF)
- #define REAL_TO_YCELL(y) (y * win.ws_row / 0x3FFF)
+ #define REAL_TO_XCELL(x) (x * console.max_x / 0x3FFF)
+ #define REAL_TO_YCELL(y) (y * console.max_y / 0x3FFF)
#define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL))
#define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \
@@ -1456,11 +1457,11 @@
int x, y, pressure;
x = ((data[4] & 0x1f) << 12) | ((data[3] & 0x3f) << 6) | (data[2] & 0x3f);
- state->x = x * win.ws_col / (wizardpad_width * 40);
+ state->x = x * console.max_x / (wizardpad_width * 40);
realposx = x * 16383 / (wizardpad_width * 40);
y = ((data[7] & 0x1f) << 12) | ((data[6] & 0x3f) << 6) | (data[5] & 0x3f);
- state->y = win.ws_row - y * win.ws_row / (wizardpad_height * 40) - 1;
+ state->y = console.max_y - y * console.max_y / (wizardpad_height * 40) - 1;
realposy = 16383 - y * 16383 / (wizardpad_height * 40) - 1;
pressure = ((data[9] & 0x0f) << 4) | (data[8] & 0x0f);
diff -Nru a/src/report.c b/src/report.c
--- a/src/report.c 2004-08-10 01:17:57 -05:00
+++ b/src/report.c 2004-08-10 01:17:57 -05:00
@@ -31,6 +31,7 @@
#include "headers/gpmInt.h"
#include "headers/message.h"
+#include "headers/console.h"
/*
* gpm_report
@@ -70,7 +71,7 @@
void gpm_report(int line, char *file, int stat, char *text, ... )
{
- FILE *console = NULL;
+ FILE *f = NULL;
va_list ap;
va_start(ap,text);
@@ -138,11 +139,11 @@
syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN);
vsyslog(LOG_DAEMON | LOG_WARNING, text, ap);
#endif
- if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) {
- fprintf(console,GPM_STRING_WARN);
- vfprintf(console,text,ap);
- fprintf(console,"\n");
- fclose(console);
+ if ((f = fopen(GPM_SYS_CONSOLE, "a")) != NULL) {
+ fprintf(f, GPM_STRING_WARN);
+ vfprintf(f, text, ap);
+ fprintf(f, "\n");
+ fclose(f);
}
break;
@@ -151,18 +152,18 @@
syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR);
vsyslog(LOG_DAEMON | LOG_ERR, text, ap);
#endif
- if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) {
- fprintf(console,GPM_STRING_ERR);
- vfprintf(console,text,ap);
- fprintf(console,"\n");
- fclose(console);
+ if ((f = fopen(GPM_SYS_CONSOLE, "a")) != NULL) {
+ fprintf(f, GPM_STRING_ERR);
+ vfprintf(f, text, ap);
+ fprintf(f, "\n");
+ fclose(f);
}
- if((console = fopen(option.consolename,"a")) != NULL) {
- fprintf(console,GPM_STRING_ERR);
- vfprintf(console,text,ap);
- fprintf(console,"\n");
- fclose(console);
+ if ((f = fopen(console.device, "a")) != NULL) {
+ fprintf(f, GPM_STRING_ERR);
+ vfprintf(f, text, ap);
+ fprintf(f, "\n");
+ fclose(f);
}
break;
@@ -184,24 +185,24 @@
case GPM_RUN_DEBUG:
switch(stat) {
case GPM_STAT_INFO:
- console = stdout;
- fprintf(console,GPM_STRING_INFO); break;
+ f = stdout;
+ fprintf(f, GPM_STRING_INFO); break;
case GPM_STAT_WARN:
- console = stderr;
- fprintf(console,GPM_STRING_WARN); break;
+ f = stderr;
+ fprintf(f, GPM_STRING_WARN); break;
case GPM_STAT_ERR:
- console = stderr;
- fprintf(console,GPM_STRING_ERR); break;
+ f = stderr;
+ fprintf(f, GPM_STRING_ERR); break;
case GPM_STAT_DEBUG:
- console = stderr;
- fprintf(console,GPM_STRING_DEBUG); break;
+ f = stderr;
+ fprintf(f, GPM_STRING_DEBUG); break;
case GPM_STAT_OOPS:
- console = stderr;
- fprintf(console,GPM_STRING_OOPS); break;
+ f = stderr;
+ fprintf(f, GPM_STRING_OOPS); break;
}
- vfprintf(console,text,ap);
- fprintf(console,"\n");
+ vfprintf(f, text, ap);
+ fprintf(f, "\n");
if(stat == GPM_STAT_OOPS) exit(1);
diff -Nru a/src/special.c b/src/special.c
--- a/src/special.c 2004-08-10 01:17:57 -05:00
+++ b/src/special.c 2004-08-10 01:17:57 -05:00
@@ -37,6 +37,7 @@
#include <sys/param.h>
#include "headers/gpmInt.h"
+#include "headers/console.h"
/*
* This function is only called at button press, to avoid unnecessary
@@ -78,7 +79,7 @@
return 1;
/* devfs change */
- consolef=fopen(option.consolename,"w");
+ consolef = fopen(console.device, "w");
if (!consolef) consolef=stderr;
if (event->type & GPM_TRIPLE) /* just triggered: make noise and return */
{
@@ -153,7 +154,7 @@
case 0: /* child */
close(0); close(1); close(2);
open(GPM_NULL_DEV,O_RDONLY); /* stdin */
- open(option.consolename,O_WRONLY); /* stdout */
+ open(console.device, O_WRONLY); /* stdout */
dup(1); /* stderr */
for (i=3;i<OPEN_MAX; i++) close(i);
execl("/bin/sh","sh","-c",command,(char *)NULL);
diff -Nru a/src/startup.c b/src/startup.c
--- a/src/startup.c 2004-08-10 01:17:57 -05:00
+++ b/src/startup.c 2004-08-10 01:17:57 -05:00
@@ -34,6 +34,7 @@
#include "headers/gpmInt.h"
#include "headers/message.h"
+#include "headers/console.h"
/* what todo atexit */
static void gpm_exited(void)
@@ -67,14 +68,14 @@
option.run_status = GPM_RUN_STARTUP; /* 10,9,8,... let's go */
option.autodetect = 0; /* no mouse autodection */
option.progname = argv[0]; /* who we are */
- option.consolename = Gpm_get_console(); /* get consolename */
/* basic2: are not necessary for oops()ing, if not root */
option.no_mice = 0; /* counts -m + -t */
option.micelist = NULL; /* no mice found yet */
option.repeater = 0; /* repeat data */
option.repeater_type = NULL; /* type of */
-
+
+ console.device = Gpm_get_console(); /* get consolename */
cmdline(argc, argv); /* parse command line */
@@ -87,8 +88,9 @@
/****************** OLD CODE from gpn.c ***********************/
openlog(option.progname, LOG_PID,
- option.run_status != GPM_RUN_DEBUG ? LOG_DAEMON : LOG_USER);
- loadlut(opt_lut);
+ option.run_status != GPM_RUN_DEBUG ? LOG_DAEMON : LOG_USER);
+
+ console_load_lut();
if (option.repeater) {
if(mkfifo(GPM_NODE_FIFO,0666) && errno!=EEXIST)
diff -Nru a/src/twiddler.c b/src/twiddler.c
--- a/src/twiddler.c 2004-08-10 01:17:57 -05:00
+++ b/src/twiddler.c 2004-08-10 01:17:57 -05:00
@@ -54,6 +54,7 @@
#include "headers/gpm.h"
#include "headers/gpmInt.h"
#include "headers/message.h"
+#include "headers/console.h"
#include "headers/twiddler.h"
@@ -134,17 +135,6 @@
int (*fun)(char *string);
};
-
-/* The same silly function as in gpm.c */
-static inline int open_console(const int mode)
-{
- int fd;
- extern struct options option;
- if ((fd=open(option.consolename, mode)) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN,option.consolename);
- return fd;
-}
-
-
/*===================================================================*/
/* This part deals with pushing keys */
@@ -175,7 +165,7 @@
int twiddler_exec(char *s)
{
int pid;
- extern struct options option;
+
switch(pid=fork()) {
case -1: return -1;
case 0:
@@ -184,7 +174,7 @@
close(2); /* very rude! */
open(GPM_NULL_DEV,O_RDONLY);
- open(option.consolename,O_WRONLY);
+ open(console.device, O_WRONLY);
dup(1);
execl("/bin/sh", "sh", "-c", s, NULL);
exit(1); /* shouldn't happen */
More information about the gpm
mailing list