Hello, here goes updated +clock diff against 1.20.1rc1. Yes, it's still buggy somehow and with various evil tricks it's possible to convience it to mess up the screen when selecting contents behind it. Yes, it's non-system solution and it should rather reside in something like gpm-root. But it's IMHO still very tiny and nice feature and living as a patch somewhere is enough for it until someone will adapt it to gpm-root. Kind regards, -- Petr "Pasky" Baudis * ELinks maintainer * IPv6 guy (XS26 co-coordinator) * IRCnet operator * FreeCiv AI occassional hacker . You can get much further with a kind word and a gun than you can with a kind word alone. -- Al Capone . Public PGP key && geekcode && homepage: http://pasky.ji.cz/~pasky/
diff -ru gpm-1.20.1rc1/src/gpm.c gpm-1.20.1rc1+clock/src/gpm.c --- gpm-1.20.1rc1/src/gpm.c Wed May 29 00:47:24 2002 +++ gpm-1.20.1rc1+clock/src/gpm.c Mon Aug 5 18:45:27 2002 @@ -32,6 +32,7 @@ #include <sys/fcntl.h> /* O_RDONLY */ #include <sys/wait.h> /* wait() */ #include <sys/stat.h> /* mkdir() */ +#include <time.h> /* time() */ #include <sys/time.h> /* timeval */ #include <sys/types.h> /* socket() */ #include <sys/socket.h> /* socket() */ @@ -85,6 +86,7 @@ int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ int opt_rawrep=0; +int opt_clock = 0; Gpm_Type *repeated_type=0; static int opt_resize=0; /* not really an option */ @@ -92,6 +94,7 @@ struct winsize win; int maxx, maxy; int fifofd=-1; +static int clock_printed = -1; char *consolename; int run_status = GPM_RUN_STARTUP; @@ -243,6 +246,52 @@ close(fd); } +#define CLOCK_FMT "%02d:%02d" +#define CLOCK_LEN 5 +#define POSITION (4 + 2 * (0 * 80 + (maxx - CLOCK_LEN - 1))) + +static void display_clock(int restore) +{ + int fd; + static char save[CLOCK_LEN * 2]; + + if ((fd = open("/dev/vcc/a", O_RDWR)) < 1) { + if (errno != ENOENT) + oops("open(\"/dev/vcc/a\")"); + if ((fd = open("/dev/vcsa", O_RDWR)) < 1) + oops("open(\"/dev/vcsa\")"); + } + if (restore == 2) { /* restore the old characters */ + lseek(fd, POSITION, 0); + write(fd, &save, sizeof(save)); + } else { /* print the clock */ + char buf[CLOCK_LEN * 2], buf0[CLOCK_LEN]; + time_t t; + struct tm *tm; + int i, j; + + if (restore == 0) { /* save the old characters for later */ + lseek(fd, POSITION, 0); + read(fd, &save, sizeof(save)); + } + t = time(NULL); + tm = localtime(&t); + sprintf(buf0, CLOCK_FMT, tm->tm_hour, tm->tm_min); + i = j = 0; + while (i <= sizeof(buf0)) { /* add the color attribute */ + buf[j++] = buf0[i++]; + buf[j++] = '\032'; /* green on blue */ + } + lseek(fd, POSITION, 0); + write(fd, &buf, sizeof(buf)); + } + close(fd); +} + +#undef POSITION +#undef CLOCK_FMT +#undef CLOCK_LEN + /*-------------------------------------------------------------------*/ static inline int do_selection(Gpm_Event *event) /* returns 0, always */ { @@ -253,7 +302,18 @@ 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--; + if (y2<1) y2++; else if (y2>maxy) y2--; + if (opt_clock && x2 == maxx && y2 == 1 + && (clock_printed < 0 || clock_printed == event->vc)) { + selection_copy(x2,y2,x2,y2,3); /* move pointer before saving content + of the screen, so we don't get + pollution after clock hiding */ + display_clock(clock_printed); /* print the clock */ + clock_printed = event->vc; + } else if (clock_printed == event->vc) { + display_clock(2); /* restore the screen */ + clock_printed = -1; + } selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ return 0; Only in gpm-1.20.1rc1+clock/src: gpm.c.rej Only in gpm-1.20.1rc1+clock/src: gpm.c~ diff -ru gpm-1.20.1rc1/src/gpn.c gpm-1.20.1rc1+clock/src/gpn.c --- gpm-1.20.1rc1/src/gpn.c Wed May 29 00:39:16 2002 +++ gpm-1.20.1rc1+clock/src/gpn.c Mon Aug 5 18:46:55 2002 @@ -233,7 +233,7 @@ *****************************************************************************/ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:cd:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; int i, opt; extern int run_status; /* main */ extern char *prgname; /* main */ @@ -263,6 +263,7 @@ break; case 'b': opt_baud = atoi(optarg); break; case 'B': opt_sequence = optarg; break; + case 'c': opt_clock = 1; break; case 'd': opt_delta = atoi(optarg); break; case 'D': run_status = GPM_RUN_DEBUG; break; case 'g': opt_glidepoint_tap=atoi(optarg); break; diff -ru gpm-1.20.1rc1/src/headers/gpmInt.h gpm-1.20.1rc1+clock/src/headers/gpmInt.h --- gpm-1.20.1rc1/src/headers/gpmInt.h Sat Feb 23 22:19:07 2002 +++ gpm-1.20.1rc1+clock/src/headers/gpmInt.h Mon Aug 5 18:43:30 2002 @@ -153,6 +153,7 @@ extern time_t opt_age_limit; extern char *opt_special; extern int opt_rawrep; +extern int opt_clock; extern int fifofd; extern char *consolename; diff -ru gpm-1.20.1rc1/src/headers/message.h gpm-1.20.1rc1+clock/src/headers/message.h --- gpm-1.20.1rc1/src/headers/message.h Wed May 29 00:42:03 2002 +++ gpm-1.20.1rc1+clock/src/headers/message.h Mon Aug 5 18:48:44 2002 @@ -74,6 +74,7 @@ " -A [limit] start with selection disabled (`aged')\n" \ " -b baud-rate sets the baud rate (default %d)\n" \ " -B sequence allows changing the buttons (default '%s')\n" \ + " -c print small clock in top-right screen corner\n" \ " -d delta sets the delta value (default %d) (must be 2 or more)\n" \ " -D debug mode: don't auto-background\n" \ " -g tap-button sets the button (1-3) that is emulated by tapping on\n" \