[gpm] [PATCH 18/18] console-selection-split.patch

Dmitry Torokhov dtor_core@ameritech.net
Tue Aug 10 09:03:53 CEST 2004


===================================================================


ChangeSet@1.22, 2004-08-10 01:12:33-05:00, dtor_core@ameritech.net
  Separate console and selection handling, separate library and
  server console implementation so server can be changed freely
  without fear of breaking clients API. 


 Makefile.in         |    8 +-
 client.c            |    1 
 console.c           |  171 ++++++++++++++--------------------------------------
 gpm.c               |    1 
 gpn.c               |    1 
 headers/console.h   |   16 ----
 headers/selection.h |   37 +++++++++++
 lib/tools.c         |   81 ++++++++++++++++++++++++
 selection.c         |  156 +++++++++++++++++++++++++++++++++++++++++++++++
 startup.c           |    4 -
 tools.c             |   81 ------------------------
 11 files changed, 335 insertions(+), 222 deletions(-)


===================================================================



diff -Nru a/src/Makefile.in b/src/Makefile.in
--- a/src/Makefile.in	2004-08-10 01:18:02 -05:00
+++ b/src/Makefile.in	2004-08-10 01:18:02 -05:00
@@ -15,13 +15,13 @@
 MICESRC = mice.c twiddler.c synaptics.c @EVDEV_SRCS@
 
 GSRC = main.c gpm.c gpn.c special.c startup.c server_tools.c console.c \
-       client.c optparser.c $(MICESRC)
+       selection.c client.c optparser.c $(MICESRC)
 
-GOBJ = $(GSRC:.c=.o) report.o tools.o
+GOBJ = $(GSRC:.c=.o) report.o
 
-LSRC = lib/liblow.c lib/libhigh.c lib/libxtra.c lib/report-lib.c
+LSRC = lib/liblow.c lib/libhigh.c lib/libxtra.c lib/report-lib.c lib/tools.c
 
-LOBJ = $(LSRC:.c=.o) tools.o @CURSES_OBJS@
+LOBJ = $(LSRC:.c=.o) @CURSES_OBJS@
 
 PICS = $(LOBJ:.o=.lo)
 
diff -Nru a/src/client.c b/src/client.c
--- a/src/client.c	2004-08-10 01:18:02 -05:00
+++ b/src/client.c	2004-08-10 01:18:02 -05:00
@@ -39,6 +39,7 @@
 #include "headers/gpmInt.h"
 #include "headers/message.h"
 #include "headers/console.h"
+#include "headers/selection.h"
 #include "headers/client.h"
 
 /* who the f*** runs gpm without glibc? doesn't have dietlibc __socklent_t? */
diff -Nru a/src/console.c b/src/console.c
--- a/src/console.c	2004-08-10 01:18:02 -05:00
+++ b/src/console.c	2004-08-10 01:18:02 -05:00
@@ -46,10 +46,33 @@
 # 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;
+/*-------------------------------------------------------------------*/
+static int count_digits(int num)
+{
+   int digits = 1;
+
+   while ((num /= 10))
+      digits++;
+
+   return digits;
+}
+
+/*-------------------------------------------------------------------*/
+char *compose_vc_name(int vc)
+{
+   char  *tty;
+
+   tty = malloc(strlen(console.device) + count_digits(vc) + sizeof(char));
+   if (tty) {
+      /* console is /dev/vc/0 or /dev/tty0 and we trimming the ending 0 */
+      strncpy(tty, console.device, strlen(console.device) - 1);
+      sprintf(&tty[strlen(console.device) - 1], "%d", vc);
+   }
+
+   return tty;
+}
 
 /*-------------------------------------------------------------------*/
 int open_console(int mode)
@@ -129,23 +152,15 @@
    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);
+   if ((tty = compose_vc_name(vc)) == NULL)
+      gpm_report(GPM_PR_OOPS, GPM_MESS_NO_MEM);
 
-   rc = stat(tty, &statbuf);
+   if ((rc = stat(tty, &statbuf)) == -1)
+      gpm_report(GPM_PR_ERR, GPM_MESS_STAT_FAILS, tty);
 
    free(tty);
 
-   if (rc == -1) {
-      gpm_report(GPM_PR_ERR, GPM_MESS_STAT_FAILS, tty);
-      return 0;
-   }
-
-   return uid == statbuf.st_uid;
+   return rc != -1 && uid == statbuf.st_uid;
 }
 
 /*-------------------------------------------------------------------*/
@@ -218,113 +233,25 @@
 }
 
 /*-------------------------------------------------------------------*/
-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 */
+/* Returns the name of the console (/dev/tty0 or /dev/vc/0)          */
+/* Also fills console.device                                         */
+char *get_console_name()
+{
+   struct stat buf;
+
+   /* first try the devfs device, because in the next time this will be
+    * the preferred one. If that fails, take the old console */
+
+   /* Check for open new console */
+   if (stat(GPM_DEVFS_CONSOLE, &buf) == 0)
+      console.device = GPM_DEVFS_CONSOLE;
+
+   /* Failed, try OLD console */
+   else if (stat(GPM_OLD_CONSOLE, &buf) == 0)
+      console.device = GPM_OLD_CONSOLE;
+   else
+      gpm_report(GPM_PR_OOPS, "Can't determine console device");
 
-   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;
+   return console.device;
 }
 
diff -Nru a/src/gpm.c b/src/gpm.c
--- a/src/gpm.c	2004-08-10 01:18:01 -05:00
+++ b/src/gpm.c	2004-08-10 01:18:02 -05:00
@@ -37,6 +37,7 @@
 #include "headers/gpmInt.h"
 #include "headers/message.h"
 #include "headers/console.h"
+#include "headers/selection.h"
 #include "headers/client.h"
 
 #ifndef max
diff -Nru a/src/gpn.c b/src/gpn.c
--- a/src/gpn.c	2004-08-10 01:18:02 -05:00
+++ b/src/gpn.c	2004-08-10 01:18:02 -05:00
@@ -34,6 +34,7 @@
 #include "headers/gpmInt.h"
 #include "headers/gpm.h"
 #include "headers/console.h"
+#include "headers/selection.h"
 
 /* usage: display for usage informations */
 int usage(char *whofailed)
diff -Nru a/src/headers/console.h b/src/headers/console.h
--- a/src/headers/console.h	2004-08-10 01:18:02 -05:00
+++ b/src/headers/console.h	2004-08-10 01:18:02 -05:00
@@ -27,26 +27,16 @@
    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 */
+extern struct gpm_console console;
 
 int   open_console(int mode);
+char  *get_console_name();
+char  *compose_vc_name(int vc);
 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/selection.h b/src/headers/selection.h
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/src/headers/selection.h	2004-08-10 01:18:02 -05:00
@@ -0,0 +1,37 @@
+/*
+ * selection.h - GPM selection/copy/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_SELECTION_H_
+#define __GPM_SELECTION_H_
+
+struct sel_options {
+   int      aged;
+   int      age_limit;
+   int      ptrdrag;
+};
+
+struct Gpm_Event;
+
+extern struct sel_options sel_opts; /* only one exists */
+
+void  do_selection(struct Gpm_Event *event, int three_button_mode);
+void  selection_disable_paste(void);
+
+#endif /* __GPM_SELECTION_H_ */
diff -Nru a/src/lib/tools.c b/src/lib/tools.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/src/lib/tools.c	2004-08-10 01:18:01 -05:00
@@ -0,0 +1,81 @@
+/*
+ * tools.c - tools which are needed by client and server
+ *
+ * Copyright (c) 2001 	     Nico Schottelius <nico@schottelius.org>
+ *
+ *   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> /* NULL */
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>  /* these three are */
+#include <sys/stat.h>   /* needed for      */
+#include <unistd.h>     /* stat() */
+
+#include "headers/gpmInt.h"   /* only used for some defines */
+
+/*****************************************************************************
+ * check, whether devfs is used or not.
+ * See /usr/src/linux/Documentation/filesystems/devfs/ for details.
+ * Returns: the name of the console (/dev/tty0 or /dev/vc/0)
+ *****************************************************************************/
+char *Gpm_get_console(void)
+{
+   struct stat buf;
+
+   /* first try the devfs device, because in the next time this will be
+    * the preferred one. If that fails, take the old console */
+
+   /* Check for open new console */
+   if (stat(GPM_DEVFS_CONSOLE, &buf) == 0)
+      return strdup(GPM_DEVFS_CONSOLE);
+
+   /* Failed, try OLD console */
+   else if (stat(GPM_OLD_CONSOLE, &buf) == 0)
+      return strdup(GPM_OLD_CONSOLE);
+
+   return NULL;
+}
+
+/* what's the english name for potenz ? */
+int Gpm_x_high_y(int base, int pot_y)
+{
+   int val = 1;
+
+   if (pot_y == 0) val = 1;
+   else if (pot_y  < 0) val = 0;     /* ugly hack ;) */
+   else while(pot_y > 0) {
+      val = val * base;
+      pot_y--;
+   }
+   return val;
+}
+
+/* return characters needed to display int */
+int Gpm_cnt_digits(int number)
+{
+   /* 0-9 = 1        10^0 <-> (10^1)-1
+    * 10 - 99 = 2    10^1 <-> (10^2)-1
+    * 100 - 999 = 3  10^2 <-> (10^3)-1
+    * 1000 - 9999 = 4 ...  */
+
+   int digits = 1;
+
+   while ((number /= 10))
+      digits++;
+
+   return digits;
+}
diff -Nru a/src/selection.c b/src/selection.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/src/selection.c	2004-08-10 01:18:02 -05:00
@@ -0,0 +1,156 @@
+/*
+ * selection.c - GPM selection/copy/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/message.h"
+#include "headers/console.h"
+#include "headers/selection.h"
+
+struct sel_options sel_opts = { 0, 0, DEF_PTRDRAG };
+static time_t last_selection_time;
+
+/*-------------------------------------------------------------------*/
+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);
+         }
+         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;
+         }
+   }
+}
+
+/*-------------------------------------------------------------------*/
+void selection_disable_paste(void)
+{
+   sel_opts.aged = 1;
+}
diff -Nru a/src/startup.c b/src/startup.c
--- a/src/startup.c	2004-08-10 01:18:02 -05:00
+++ b/src/startup.c	2004-08-10 01:18:02 -05:00
@@ -36,6 +36,7 @@
 #include "headers/gpmInt.h"
 #include "headers/message.h"
 #include "headers/console.h"
+#include "headers/selection.h"
 
 /* what todo atexit */
 static void gpm_exited(void)
@@ -55,8 +56,7 @@
    option.autodetect    = 0;                    /* no mouse autodection */
    option.progname      = argv[0];              /* who we are */
 
-   console.device       = Gpm_get_console();    /* get consolename */
-
+   get_console_name();
    cmdline(argc, argv);                         /* parse command line */
 
    if (geteuid() != 0) gpm_report(GPM_PR_OOPS,GPM_MESS_ROOT); /* root or exit */
diff -Nru a/src/tools.c b/src/tools.c
--- a/src/tools.c	2004-08-10 01:18:01 -05:00
+++ /dev/null	Wed Dec 31 16:00:00 196900
@@ -1,81 +0,0 @@
-/*
- * tools.c - tools which are needed by client and server
- *
- * Copyright (c) 2001 	     Nico Schottelius <nico@schottelius.org>
- *
- *   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> /* NULL */
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>  /* these three are */
-#include <sys/stat.h>   /* needed for      */
-#include <unistd.h>     /* stat() */
-
-#include "headers/gpmInt.h"   /* only used for some defines */
-
-/*****************************************************************************
- * check, whether devfs is used or not.
- * See /usr/src/linux/Documentation/filesystems/devfs/ for details.
- * Returns: the name of the console (/dev/tty0 or /dev/vc/0)
- *****************************************************************************/
-char *Gpm_get_console(void)
-{
-   struct stat buf;
-
-   /* first try the devfs device, because in the next time this will be
-    * the preferred one. If that fails, take the old console */
-
-   /* Check for open new console */
-   if (stat(GPM_DEVFS_CONSOLE, &buf) == 0)
-      return strdup(GPM_DEVFS_CONSOLE);
-
-   /* Failed, try OLD console */
-   else if (stat(GPM_OLD_CONSOLE, &buf) == 0)
-      return strdup(GPM_OLD_CONSOLE);
-
-   return NULL;
-}
-
-/* what's the english name for potenz ? */
-int Gpm_x_high_y(int base, int pot_y)
-{
-   int val = 1;
-
-   if (pot_y == 0) val = 1;
-   else if (pot_y  < 0) val = 0;     /* ugly hack ;) */
-   else while(pot_y > 0) {
-      val = val * base;
-      pot_y--;
-   }
-   return val;
-}
-
-/* return characters needed to display int */
-int Gpm_cnt_digits(int number)
-{
-   /* 0-9 = 1        10^0 <-> (10^1)-1
-    * 10 - 99 = 2    10^1 <-> (10^2)-1
-    * 100 - 999 = 3  10^2 <-> (10^3)-1
-    * 1000 - 9999 = 4 ...  */
-
-   int digits = 1;
-
-   while ((number /= 10))
-      digits++;
-
-   return digits;
-}


More information about the gpm mailing list